首页
/ 2025全新教程:MaterialDesignInXamlToolkit快速上手,30分钟打造现代化WPF界面

2025全新教程:MaterialDesignInXamlToolkit快速上手,30分钟打造现代化WPF界面

2026-02-04 05:06:43作者:邓越浪Henry

你是否还在为WPF应用界面陈旧、开发效率低下而烦恼?是否想快速将Google Material Design的精美UI引入你的桌面应用?本文将带你在30分钟内完成MaterialDesignInXamlToolkit的环境搭建与核心组件应用,让你的WPF应用焕然一新。读完本文你将掌握:

  • 开发环境的快速配置与项目初始化
  • 主题切换与色彩系统定制
  • 常用UI组件的实战应用
  • 布局系统与响应式设计
  • 性能优化与高级功能

一、环境准备与项目搭建

1.1 开发环境要求

软件/工具 最低版本要求 推荐版本
Visual Studio 2019 2022 17.5+
.NET SDK .NET 5.0 .NET 8.0
Git 2.30.0 2.40.0+

1.2 项目初始化

通过命令行克隆仓库并创建示例项目:

# 克隆仓库
git clone https://gitcode.com/gh_mirrors/ma/MaterialDesignInXamlToolkit

# 创建新的WPF项目
dotnet new wpf -n MaterialDesignDemo
cd MaterialDesignDemo

# 添加MaterialDesignThemes NuGet包
dotnet add package MaterialDesignThemes --version 4.9.0

二、基础配置与主题设置

2.1 App.xaml配置

修改App.xaml文件,引入Material Design主题资源:

<Application 
  x:Class="MaterialDesignDemo.App"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
  StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <!-- 基础主题设置 -->
                <materialDesign:BundledTheme 
                    BaseTheme="Light" 
                    PrimaryColor="DeepPurple" 
                    SecondaryColor="Lime" />
                
                <!-- 控件样式 -->
                <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesign2.Defaults.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

2.2 窗口样式应用

修改MainWindow.xaml,应用Material Design窗口样式:

<Window x:Class="MaterialDesignDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
        Title="Material Design Demo" 
        Height="450" Width="800"
        Style="{StaticResource MaterialDesignWindow}">
    <Grid>
        <!-- 窗口内容将在这里添加 -->
        <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"
                   FontSize="24" materialDesign:TextBlockAssist.FontWeight="Medium">
            Hello Material Design!
        </TextBlock>
    </Grid>
</Window>

三、核心组件实战应用

3.1 按钮(Button)与图标(PackIcon)

Material Design提供了丰富的按钮样式和图标库:

<StackPanel Margin="16" Orientation="Horizontal" Spacing="8">
    <!-- 主要按钮 -->
    <Button Style="{StaticResource MaterialDesignRaisedButton}" 
            Content="主要按钮" />
    
    <!-- 次要按钮 -->
    <Button Style="{StaticResource MaterialDesignRaisedSecondaryButton}" 
            Content="次要按钮" />
    
    <!-- 图标按钮 -->
    <Button Style="{StaticResource MaterialDesignIconButton}">
        <materialDesign:PackIcon Kind="Add" />
    </Button>
    
    <!-- 文本按钮 -->
    <Button Style="{StaticResource MaterialDesignFlatButton}" 
            Content="文本按钮" />
    
    <!-- 带图标的按钮 -->
    <Button Style="{StaticResource MaterialDesignRaisedButton}">
        <StackPanel Orientation="Horizontal" Spacing="8">
            <materialDesign:PackIcon Kind="Save" />
            <TextBlock>保存</TextBlock>
        </StackPanel>
    </Button>
</StackPanel>

3.2 文本框(TextField)与输入控件

现代化的表单控件与验证反馈:

<StackPanel Margin="16" Spacing="16">
    <!-- 基本文本框 -->
    <TextBox materialDesign:HintAssist.Hint="用户名" 
             Style="{StaticResource MaterialDesignOutlinedTextBox}" />
    
    <!-- 带图标的文本框 -->
    <TextBox materialDesign:HintAssist.Hint="密码" 
             materialDesign:TextFieldAssist.PrefixIcon="{materialDesign:PackIcon Kind=Lock}"
             Style="{StaticResource MaterialDesignOutlinedTextBox}" 
             PasswordChar="●" />
    
    <!-- 多行文本框 -->
    <TextBox materialDesign:HintAssist.Hint="备注信息" 
             Style="{StaticResource MaterialDesignOutlinedTextBox}" 
             AcceptsReturn="True" Height="100" />
    
    <!-- 带错误提示的文本框 -->
    <TextBox materialDesign:HintAssist.Hint="邮箱地址" 
             materialDesign:ValidationAssist.ErrorContent="请输入有效的邮箱地址"
             Style="{StaticResource MaterialDesignOutlinedTextBox}" />
</StackPanel>

3.3 卡片(Card)与列表(List)

信息展示的核心组件:

<ScrollViewer Margin="16">
    <StackPanel Spacing="16">
        <!-- 基本卡片 -->
        <materialDesign:Card materialDesign:ElevationAssist.Elevation="Dp4">
            <StackPanel Margin="16">
                <TextBlock FontSize="18" materialDesign:TextBlockAssist.FontWeight="Medium">
                    基本卡片
                </TextBlock>
                <TextBlock Margin="0,8,0,0" Opacity="0.6">
                    这是一个基本的卡片组件,可以包含各种内容如文本、图片和按钮。
                </TextBlock>
                <Button Margin="0,16,0,0" Style="{StaticResource MaterialDesignFlatButton}">
                    了解更多
                </Button>
            </StackPanel>
        </materialDesign:Card>
        
        <!-- 带阴影的卡片列表 -->
        <ItemsControl ItemsSource="{Binding Items}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <materialDesign:Card Margin="0,0,0,16" 
                                         materialDesign:ElevationAssist.Elevation="Dp2"
                                         MouseEnter="Card_MouseEnter"
                                         MouseLeave="Card_MouseLeave">
                        <StackPanel Margin="16" Orientation="Horizontal" Spacing="16">
                            <materialDesign:PackIcon Kind="{Binding Icon}" 
                                                     Width="24" Height="24" />
                            <StackPanel>
                                <TextBlock Text="{Binding Title}" 
                                           materialDesign:TextBlockAssist.FontWeight="Medium" />
                                <TextBlock Text="{Binding Description}" 
                                           Opacity="0.6" Margin="0,4,0,0" />
                            </StackPanel>
                        </StackPanel>
                    </materialDesign:Card>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </StackPanel>
</ScrollViewer>

3.4 对话框(Dialog)与提示(Snackbar)

用户交互与反馈机制:

<Grid>
    <!-- 对话框主机 -->
    <materialDesign:DialogHost Identifier="RootDialog">
        <StackPanel Margin="16" Spacing="16">
            <Button Click="ShowDialog_Click" 
                    Content="显示对话框" 
                    Style="{StaticResource MaterialDesignRaisedButton}" />
            
            <Button Click="ShowSnackbar_Click" 
                    Content="显示提示消息" 
                    Style="{StaticResource MaterialDesignRaisedSecondaryButton}" />
        </StackPanel>
    </materialDesign:DialogHost>
    
    <!-- 提示消息控件 -->
    <materialDesign:Snackbar x:Name="MainSnackbar" 
                             HorizontalAlignment="Center" 
                             VerticalAlignment="Bottom"
                             Margin="16" />
</Grid>

对应的后台代码:

private async void ShowDialog_Click(object sender, RoutedEventArgs e)
{
    var dialogResult = await materialDesign:DialogHost.Show(
        new StackPanel Margin="16" Spacing="16">
            <TextBlock FontSize="18" materialDesign:TextBlockAssist.FontWeight="Medium">
                确认操作
            </TextBlock>
            <TextBlock>
                您确定要执行此操作吗?此操作无法撤销。
            </TextBlock>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Spacing="8">
                <Button Command="materialDesign:DialogHost.CloseDialogCommand" 
                        Content="取消" 
                        Style="{StaticResource MaterialDesignFlatButton}" />
                <Button Command="materialDesign:DialogHost.CloseDialogCommand" 
                        Content="确认" 
                        Style="{StaticResource MaterialDesignRaisedButton}" 
                        CommandParameter="true" />
            </StackPanel>
        </StackPanel>, "RootDialog");
    
    if (dialogResult is bool result && result)
    {
        // 用户点击了确认按钮
        MainSnackbar.MessageQueue.Enqueue("操作已完成");
    }
}

private void ShowSnackbar_Click(object sender, RoutedEventArgs e)
{
    MainSnackbar.MessageQueue.Enqueue("这是一条提示消息");
}

四、主题切换与个性化定制

4.1 运行时切换主题

实现明暗主题与颜色方案的动态切换:

<StackPanel Margin="16" Spacing="16">
    <TextBlock FontSize="18" materialDesign:TextBlockAssist.FontWeight="Medium">
        主题设置
    </TextBlock>
    
    <!-- 明暗主题切换 -->
    <ToggleButton x:Name="ThemeToggle"
                  IsChecked="{Binding IsDarkTheme}">
        <StackPanel Orientation="Horizontal" Spacing="8">
            <materialDesign:PackIcon Kind="{Binding IsDarkTheme, Converter={StaticResource ThemeIconConverter}}" />
            <TextBlock Text="{Binding IsDarkTheme, Converter={StaticResource ThemeTextConverter}}" />
        </StackPanel>
    </ToggleButton>
    
    <!-- 主色调选择 -->
    <StackPanel>
        <TextBlock Margin="0,0,0,8">主色调</TextBlock>
        <WrapPanel Spacing="8">
            <Button Width="32" Height="32" Background="#6200EE" Click="ChangePrimaryColor_Click" Tag="DeepPurple" />
            <Button Width="32" Height="32" Background="#F44336" Click="ChangePrimaryColor_Click" Tag="Red" />
            <Button Width="32" Height="32" Background="#4CAF50" Click="ChangePrimaryColor_Click" Tag="Green" />
            <Button Width="32" Height="32" Background="#2196F3" Click="ChangePrimaryColor_Click" Tag="Blue" />
            <Button Width="32" Height="32" Background="#FF9800" Click="ChangePrimaryColor_Click" Tag="Orange" />
        </WrapPanel>
    </StackPanel>
</StackPanel>

主题切换的后台代码:

private readonly PaletteHelper _paletteHelper = new PaletteHelper();

private void ThemeToggle_Checked(object sender, RoutedEventArgs e)
{
    // 切换到深色主题
    var theme = _paletteHelper.GetTheme();
    theme.SetBaseTheme(Theme.Dark);
    _paletteHelper.SetTheme(theme);
}

private void ThemeToggle_Unchecked(object sender, RoutedEventArgs e)
{
    // 切换到浅色主题
    var theme = _paletteHelper.GetTheme();
    theme.SetBaseTheme(Theme.Light);
    _paletteHelper.SetTheme(theme);
}

private void ChangePrimaryColor_Click(object sender, RoutedEventArgs e)
{
    if (sender is Button button && button.Tag is string colorName)
    {
        var palette = _paletteHelper.GetPalette();
        var swatch = new SwatchesProvider().Swatches.FirstOrDefault(s => s.Name == colorName);
        
        if (swatch != null)
        {
            palette.SetPrimaryColor(swatch);
            _paletteHelper.SetPalette(palette);
        }
    }
}

五、布局系统与响应式设计

5.1 响应式网格布局

使用Grid和断点实现自适应布局:

<Grid Margin="16">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    
    <!-- 标题行 - 跨所有列 -->
    <TextBlock Grid.ColumnSpan="3" FontSize="24" materialDesign:TextBlockAssist.FontWeight="Medium"
               Margin="0,0,0,16">响应式布局示例</TextBlock>
    
    <!-- 卡片1 -->
    <materialDesign:Card Grid.Column="0" Grid.Row="1" Margin="0,0,8,0">
        <StackPanel Margin="16">
            <materialDesign:PackIcon Kind="DesktopMac" Width="48" Height="48" />
            <TextBlock Margin="0,16,0,0" FontSize="18" materialDesign:TextBlockAssist.FontWeight="Medium">
                桌面应用
            </TextBlock>
        </StackPanel>
    </materialDesign:Card>
    
    <!-- 卡片2 -->
    <materialDesign:Card Grid.Column="1" Grid.Row="1" Margin="4,0,4,0">
        <StackPanel Margin="16">
            <materialDesign:PackIcon Kind="Tablet" Width="48" Height="48" />
            <TextBlock Margin="0,16,0,0" FontSize="18" materialDesign:TextBlockAssist.FontWeight="Medium">
                平板应用
            </TextBlock>
        </StackPanel>
    </materialDesign:Card>
    
    <!-- 卡片3 -->
    <materialDesign:Card Grid.Column="2" Grid.Row="1" Margin="8,0,0,0">
        <StackPanel Margin="16">
            <materialDesign:PackIcon Kind="Phone" Width="48" Height="48" />
            <TextBlock Margin="0,16,0,0" FontSize="18" materialDesign:TextBlockAssist.FontWeight="Medium">
                移动应用
            </TextBlock>
        </StackPanel>
    </materialDesign:Card>
    
    <!-- 响应式布局触发器 -->
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup>
            <VisualState x:Name="WideScreen" />
            <VisualState x:Name="MediumScreen">
                <VisualState.StateTriggers>
                    <AdaptiveTrigger MinWindowWidth="600" MaxWindowWidth="900" />
                </VisualState.StateTriggers>
                <VisualState.Setters>
                    <Setter Target="card3.(Grid.Column)" Value="0" />
                    <Setter Target="card3.(Grid.Row)" Value="2" />
                    <Setter Target="card3.(Grid.ColumnSpan)" Value="2" />
                    <Setter Target="card3.Margin" Value="0,8,0,0" />
                </VisualState.Setters>
            </VisualState>
            <VisualState x:Name="NarrowScreen">
                <VisualState.StateTriggers>
                    <AdaptiveTrigger MaxWindowWidth="600" />
                </VisualState.StateTriggers>
                <VisualState.Setters>
                    <Setter Target="card2.(Grid.Column)" Value="0" />
                    <Setter Target="card2.(Grid.Row)" Value="2" />
                    <Setter Target="card2.Margin" Value="0,8,0,0" />
                    <Setter Target="card3.(Grid.Column)" Value="0" />
                    <Setter Target="card3.(Grid.Row)" Value="3" />
                    <Setter Target="card3.Margin" Value="0,8,0,0" />
                </VisualState.Setters>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
</Grid>

5.2 侧边栏抽屉(Drawer)

实现现代化的导航体验:

<materialDesign:DrawerHost IsLeftDrawerOpen="{Binding ElementName=MenuToggleButton, Path=IsChecked}">
    <materialDesign:DrawerHost.LeftDrawerContent>
        <!-- 侧边栏内容 -->
        <DockPanel MinWidth="240" Background="{DynamicResource MaterialDesignPaper}">
            <StackPanel Margin="16">
                <TextBlock FontSize="18" materialDesign:TextBlockAssist.FontWeight="Medium">
                    导航菜单
                </TextBlock>
                <ListBox Margin="0,16,0,0" Style="{StaticResource MaterialDesignNavigationListBox}">
                    <ListBoxItem>
                        <StackPanel Orientation="Horizontal" Spacing="16">
                            <materialDesign:PackIcon Kind="Home" />
                            <TextBlock>首页</TextBlock>
                        </StackPanel>
                    </ListBoxItem>
                    <ListBoxItem>
                        <StackPanel Orientation="Horizontal" Spacing="16">
                            <materialDesign:PackIcon Kind="Settings" />
                            <TextBlock>设置</TextBlock>
                        </StackPanel>
                    </ListBoxItem>
                    <ListBoxItem>
                        <StackPanel Orientation="Horizontal" Spacing="16">
                            <materialDesign:PackIcon Kind="HelpCircle" />
                            <TextBlock>帮助</TextBlock>
                        </StackPanel>
                    </ListBoxItem>
                </ListBox>
            </StackPanel>
        </DockPanel>
    </materialDesign:DrawerHost.LeftDrawerContent>
    
    <!-- 主内容区 -->
    <DockPanel>
        <!-- 顶部栏 -->
        <materialDesign:ColorZone DockPanel.Dock="Top" Mode="PrimaryMid" Padding="16">
            <StackPanel Orientation="Horizontal">
                <ToggleButton x:Name="MenuToggleButton"
                              Style="{StaticResource MaterialDesignHamburgerToggleButton}" />
                <TextBlock Margin="16,0,0,0" 
                           FontSize="18" 
                           VerticalAlignment="Center">
                    主内容区域
                </TextBlock>
            </StackPanel>
        </materialDesign:ColorZone>
        
        <!-- 页面内容 -->
        <ScrollViewer Margin="16">
            <TextBlock>主应用内容将显示在这里...</TextBlock>
        </ScrollViewer>
    </DockPanel>
</materialDesign:DrawerHost>

六、性能优化与最佳实践

6.1 减少布局复杂度

<!-- 避免过度嵌套 -->
<!-- 不推荐 -->
<Grid>
    <Grid.RowDefinitions><RowDefinition Height="*"/></Grid.RowDefinitions>
    <StackPanel>
        <Border>
            <TextBlock>内容</TextBlock>
        </Border>
    </StackPanel>
</Grid>

<!-- 推荐 -->
<Border Margin="16">
    <TextBlock>内容</TextBlock>
</Border>

6.2 使用Freezable对象缓存资源

<Window.Resources>
    <!-- 可冻结的画笔资源 -->
    <SolidColorBrush x:Key="CachedBrush" Color="#6200EE" x:Shared="True" />
    
    <!-- 预定义的图标资源 -->
    <materialDesign:PackIcon x:Key="UserIcon" Kind="User" x:Shared="True" />
</Window.Resources>

6.3 列表虚拟化

处理大量数据时提升性能:

<ListBox VirtualizingStackPanel.IsVirtualizing="True"
         VirtualizingStackPanel.VirtualizationMode="Recycling"
         ScrollViewer.IsDeferredScrollingEnabled="True">
    <!-- 列表内容 -->
</ListBox>

七、项目实战:任务管理应用

整合所学知识,创建一个简单但功能完整的任务管理应用:

<Window x:Class="TaskManager.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
        Title="任务管理器" Height="600" Width="800"
        Style="{StaticResource MaterialDesignWindow}">
    <materialDesign:DialogHost Identifier="RootDialog">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            
            <!-- 顶部栏 -->
            <materialDesign:ColorZone Grid.Row="0" Mode="PrimaryMid" Padding="16">
                <StackPanel Orientation="Horizontal" Spacing="16">
                    <materialDesign:PackIcon Kind="CheckCircle" Width="32" Height="32" />
                    <TextBlock FontSize="20" VerticalAlignment="Center">任务管理器</TextBlock>
                    <Button Margin="0,0,0,0" HorizontalAlignment="Right"
                            Style="{StaticResource MaterialDesignFloatingActionButton}"
                            Click="AddTask_Click">
                        <materialDesign:PackIcon Kind="Plus" />
                    </Button>
                </StackPanel>
            </materialDesign:ColorZone>
            
            <!-- 任务列表 -->
            <ScrollViewer Grid.Row="1" Margin="16">
                <StackPanel Spacing="8">
                    <!-- 任务项1 -->
                    <materialDesign:Card materialDesign:ElevationAssist.Elevation="Dp2">
                        <StackPanel Orientation="Horizontal" Margin="16">
                            <CheckBox Margin="0,2,0,0" IsChecked="False" />
                            <StackPanel Margin="16,0,0,0" Width="*">
                                <TextBlock FontSize="16" materialDesign:TextBlockAssist.FontWeight="Medium">
                                    完成Material Design教程
                                </TextBlock>
                                <TextBlock Margin="0,4,0,0" Opacity="0.6">
                                    学习并掌握MaterialDesignInXamlToolkit的核心组件
                                </TextBlock>
                                <StackPanel Orientation="Horizontal" Margin="0,8,0,0" Spacing="8">
                                    <materialDesign:Chip Content="学习" IsDeletable="False" />
                                    <materialDesign:Chip Content="WPF" IsDeletable="False" />
                                    <materialDesign:Chip Content="2小时" IsDeletable="False" />
                                </StackPanel>
                            </StackPanel>
                            <Button Style="{StaticResource MaterialDesignIconButton}">
                                <materialDesign:PackIcon Kind="MoreVert" />
                            </Button>
                        </StackPanel>
                    </materialDesign:Card>
                    
                    <!-- 任务项2 (已完成) -->
                    <materialDesign:Card materialDesign:ElevationAssist.Elevation="Dp2">
                        <StackPanel Orientation="Horizontal" Margin="16">
                            <CheckBox Margin="0,2,0,0" IsChecked="True" />
                            <StackPanel Margin="16,0,0,0" Width="*">
                                <TextBlock FontSize="16" materialDesign:TextBlockAssist.FontWeight="Medium"
                                           TextDecorations="Strikethrough" Opacity="0.6">
                                    搭建开发环境
                                </TextBlock>
                                <TextBlock Margin="0,4,0,0" Opacity="0.6">
                                    安装Visual Studio和必要的NuGet包
                                </TextBlock>
                                <StackPanel Orientation="Horizontal" Margin="0,8,0,0" Spacing="8">
                                    <materialDesign:Chip Content="环境" IsDeletable="False" />
                                    <materialDesign:Chip Content="配置" IsDeletable="False" />
                                    <materialDesign:Chip Content="30分钟" IsDeletable="False" />
                                </StackPanel>
                            </StackPanel>
                            <Button Style="{StaticResource MaterialDesignIconButton}">
                                <materialDesign:PackIcon Kind="MoreVert" />
                            </Button>
                        </StackPanel>
                    </materialDesign:Card>
                    
                    <!-- 更多任务项... -->
                </StackPanel>
            </ScrollViewer>
            
            <!-- 提示消息控件 -->
            <materialDesign:Snackbar x:Name="MainSnackbar"
                                     HorizontalAlignment="Center"
                                     VerticalAlignment="Bottom"
                                     Margin="16" />
        </Grid>
    </materialDesign:DialogHost>
</Window>

八、总结与进阶学习

通过本文的学习,你已经掌握了MaterialDesignInXamlToolkit的核心用法,能够快速构建现代化的WPF应用界面。以下是进一步提升的学习路径:

  1. 深入主题定制:学习自定义颜色方案和控件样式
  2. 动画与过渡效果:使用TransitionAssist实现页面切换动画
  3. MVVM模式整合:结合MVVM框架如Prism或MVVM Light
  4. 单元测试:学习如何测试Material Design组件
  5. 性能优化:深入理解WPF渲染机制和性能调优

MaterialDesignInXamlToolkit为WPF开发带来了全新的可能性,让你能够以更少的代码创建更具吸引力的用户界面。持续关注项目更新,探索更多高级功能,打造卓越的桌面应用体验!

如果你觉得本文对你有帮助,请点赞、收藏并关注,以便获取更多WPF和Material Design开发技巧!

登录后查看全文
热门项目推荐
相关项目推荐