微信公眾號: "Dotnet9" ,網站: "Dotnet9" ,問題或建議: "請網站留言" , 如果對您有所幫助: "歡迎贊賞" 。 .NET CORE(C ) WPF簡單菜單MVVM綁定 閱讀導航 1. 本文背景 2. 代碼實現 3. 本文參考 4. 源碼 1. 本文背景 WPF中垂直導航菜單 ...
.NET CORE(C#) WPF簡單菜單MVVM綁定
閱讀導航
- 本文背景
- 代碼實現
- 本文參考
- 源碼
1. 本文背景
WPF中垂直導航菜單大家應該都常用,本文介紹使用MVVM的方式怎麼綁定菜單,真的很簡單。
2. 代碼實現
使用 .Net Core 3.1 創建名為 “MenuMVVM” 的WPF模板項目,添加兩個Nuget庫:MaterialDesignThemes和MaterialDesignColors。
解決方案目錄結構:
- MenuMVVM
- Models
- ItemCount.cs
- MenuItem.cs
- ViewModels
- MainViewModel.cs
- Views
- MainView.xaml
- MainView.xaml.cs
- MainView.xaml
- App.xaml
- Models
2.1 引入MD控制項樣式
文件【App.xaml】,在StartupUri中設置啟動的視圖【Views/MainView.xaml】,併在【Application.Resources】節點增加MD控制項4個樣式文件
<Application x:Class="MenuMVVM.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Views/MainView.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Dark.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.Blue.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.LightBlue.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
2.2 Models
兩個簡單的菜單實體類:
2.2.1 菜單新文件信息
文件【ItemCount.cs】,定義菜單項右側的新文件顯示個數及顯示背景色:
using System.Windows.Media;
namespace MenuMVVM.Models
{
public class ItemCount
{
public Brush Color { get; private set; }
public int Value { get; private set; }
public ItemCount(Brush color, int value)
{
Color = color;
Value = value;
}
}
}
2.2.2 菜單項信息
文件【MenuItem.cs】,定義菜單項展示的名稱、圖片、新文件信息:
using MaterialDesignThemes.Wpf;
using System;
namespace MenuMVVM.Models
{
public class MenuItem
{
public String Name { get; private set; }
public PackIconKind Icon { get; private set; }
public ItemCount Count { get; private set; }
public MenuItem(String name, PackIconKind icon, ItemCount count)
{
Name = name;
Icon = icon;
Count = count;
}
}
}
其中菜單項圖標使用MD控制項自帶的字體圖標庫,通過枚舉【PackIconKind】可以很方便的使用,該庫提供的字體圖標非常豐富,目前有4836個(枚舉值有7883個),
下麵是最後幾個:
//
// 摘要:
// List of available icons for use with MaterialDesignThemes.Wpf.PackIcon.
//
// 言論:
// All icons sourced from Material Design Icons Font - https://materialdesignicons.com/
// - in accordance of https://github.com/Templarian/MaterialDesign/blob/master/license.txt.
public enum PackIconKind
{
.
.
.
ZodiacPisces = 4832,
HoroscopePisces = 4832,
ZodiacSagittarius = 4833,
HoroscopeSagittarius = 4833,
ZodiacScorpio = 4834,
HoroscopeScorpio = 4834,
ZodiacTaurus = 4835,
HoroscopeTaurus = 4835,
ZodiacVirgo = 4836,
HoroscopeVirgo = 4836
}
2.3 ViewModels
文件【MainViewModel.cs】,只定義了簡單的幾個屬性:窗體展示Logo、菜單綁定列表。屬性定義比較簡單,因為視圖MainView.xaml展示內容不多:
using MaterialDesignThemes.Wpf;
using MenuMVVM.Models;
using System.Collections.Generic;
using System.Windows.Media;
namespace MenuMVVM.ViewModels
{
public class MainViewModel
{
public string Logo { get; set; }
public List<MenuItem> LeftMenus { get; set; }
public MainViewModel()
{
Logo = "https://img.dotnet9.com/logo-foot.png";
LeftMenus = new List<MenuItem>();
LeftMenus.Add(new MenuItem("圖片", PackIconKind.Image, new ItemCount(Brushes.Black, 2)));
LeftMenus.Add(new MenuItem("音樂", PackIconKind.Music, new ItemCount(Brushes.DarkBlue, 4)));
LeftMenus.Add(new MenuItem("視頻", PackIconKind.Video, new ItemCount(Brushes.DarkGreen, 7)));
LeftMenus.Add(new MenuItem("文檔", PackIconKind.Folder, new ItemCount(Brushes.DarkOrange, 9)));
}
}
}
2.4 Views
文件【MainView.xaml】作為唯一的視圖,只有31行佈局代碼,顯示了一個Logo、菜單列表:
<Window x:Class="MenuMVVM.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="Dotnet9" Height="600" Width="1080" Background="#FF36235F" MouseLeftButtonDown="Window_MouseLeftButtonDown"
WindowStyle="None" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
<Grid>
<StackPanel Width="200" HorizontalAlignment="Left" Background="#FF472076">
<Grid Height="150" Background="White">
<Image Source="{Binding Logo}"/>
</Grid>
<ListView ItemsSource="{Binding LeftMenus}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Height="30">
<materialDesign:PackIcon Kind="{Binding Path=Icon}" Width="20" Height="20" VerticalAlignment="Center"/>
<TextBlock Text="{Binding Path=Name}" Margin="20 0" FontSize="15" VerticalAlignment="Center"/>
<Grid VerticalAlignment="Center">
<Rectangle Width="30" Height="15" RadiusY="7.15" RadiusX="7.15" Fill="{Binding Path=Count.Color}" Stroke="White" StrokeThickness="0.7"/>
<TextBlock Text="{Binding Path=Count.Value}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="9"/>
</Grid>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</Grid>
</Window>
文件【MainView.xaml.cs】作為視圖【MainView.xaml】的後臺,綁定ViewModel,並實現滑鼠左鍵拖動窗體功能:
using MenuMVVM.ViewModels;
using System.Windows;
namespace MenuMVVM.Views
{
/// <summary>
/// 演示主窗體,只用於簡單的綁定ListView控制項
/// </summary>
public partial class MainView : Window
{
public MainView()
{
this.DataContext = new MainViewModel();
InitializeComponent();
}
private void Window_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
DragMove();
}
}
}
3.本文參考
4.源碼
文中代碼已經全部給出,圖片使用站長網站外鏈,可直接Copy代碼,按解決方案目錄組織代碼文件即可運行,另附原作者視頻及源碼,見【3.本文參考】。
除非註明,文章均由 Dotnet9 整理髮布,歡迎轉載。
轉載請註明本文地址:https://dotnet9.com/7339.html
歡迎掃描下方二維碼關註 Dotnet9 的微信公眾號,本站會及時推送最新技術文章