惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
B
Blog RSS Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MyScale Blog
MyScale Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
SegmentFault 最新的问题
Y
Y Combinator Blog
月光博客
月光博客
IT之家
IT之家
T
Tailwind CSS Blog
Last Week in AI
Last Week in AI
L
LangChain Blog
博客园_首页
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
博客园 - Franky
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
V
Visual Studio Blog
小众软件
小众软件
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
N
Netflix TechBlog - Medium

博客园 - seabluescn

WPF开发快速入门【8】WPF进行简单的3D开发 WPF开发快速入门【7】WPF的拖放功能(Drag and Drop) WPF开发快速入门【6】下拉框与枚举类型 WPF开发快速入门【5】DataGrid的使用 WPF开发快速入门【4】自定义控件与用户控件 WPF开发快速入门【3】WPF的基本特性(附加属性) WPF开发快速入门【2】WPF的基本特性(Style、Trigger、Template) WPF开发快速入门【1】WPF的布局 WPF开发快速入门【0】前言与目录 WPF优秀组件推荐之FreeSpire WPF优秀组件推荐之LiveCharts WPF优秀组件推荐之Stylet(二) WPF优秀组件推荐之Stylet(一) TensorFlow.NET机器学习入门【9】后记 TensorFlow.NET机器学习入门【8】采用GPU进行学习 TensorFlow.NET机器学习入门【7】采用卷积神经网络(CNN)处理Fashion-MNIST TensorFlow.NET机器学习入门【6】采用神经网络处理Fashion-MNIST TensorFlow.NET机器学习入门【5】采用神经网络实现手写数字识别(MNIST) TensorFlow.NET机器学习入门【4】采用神经网络处理分类问题
WPF优秀组件推荐之MahApps
seabluescn · 2022-03-08 · via 博客园 - seabluescn

概述

MahApps是一套基于WPF的界面组件,通过该组件,可以使用较小的开发成本实现一个相对很好的界面效果。

官方网站:MahApps.Metro - Home

开源代码:MahApps · GitHub

本文代码基于Stylet开发,如果您还不了解Stylet,请参阅:

WPF优秀组件推荐之Stylet(一) - seabluescn - 博客园 (cnblogs.com)

WPF优秀组件推荐之Stylet(二) - seabluescn - 博客园 (cnblogs.com)

环境需求

 通过Nuget引用下列组件。(还需引用Stylet相关组件)

基本操作

修改APP.xaml文件,如下:

<Application x:Class="NiceComponents.Others.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:NiceComponents.Others"
             xmlns:s="https://github.com/canton7/Stylet" >
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <s:ApplicationLoader>
                    <s:ApplicationLoader.Bootstrapper>
                        <local:Bootstrapper />
                    </s:ApplicationLoader.Bootstrapper>
                </s:ApplicationLoader>         

                <!-- MahApps.Metro resource dictionaries. Make sure that all file names are Case Sensitive! -->
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

View Code

 修改MainView.Xaml将顶级标记Window修改为:mah:MetroWindow ,如下:

<mah:MetroWindow x:Class="NiceComponents.Others.Pages.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"      
        xmlns:mah="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro">
    <Grid>
        
    </Grid>
</mah:MetroWindow>

 修改MainView.Xaml.cs文件,将其父类修改为:MetroWindow,如下:

    public partial class MainView : MetroWindow
    {
        public MainView()
        {
            InitializeComponent();
        }
    }

 此时运行程序,就可以看到一个漆黑的窗口,因为还没有设置样式。修改App.xaml.cs文件,如下:

    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            ThemeManager.Current.ChangeTheme(this, "Light.Cyan");
        }
    }

 Light表示背景颜色,支持Light和Dark两种,Cyan为前景色,系统自带的可选颜色请参考官方文档。另外,框架支持用户自定义皮肤,具体方法官方文档讲得也比较详细了。

工具栏

工具栏左侧:

    <mah:MetroWindow.LeftWindowCommands>
        <mah:WindowCommands>
            <Image Source="/Images/App.png" ToolTip="XXX" Margin="2"/>
        </mah:WindowCommands>
    </mah:MetroWindow.LeftWindowCommands>

工具栏右侧:

    <mah:MetroWindow.RightWindowCommands>
        <mah:WindowCommands>
            <Button ToolTip="Setting" Command="{s:Action DoSetting}" ToolTipService.ShowOnDisabled="True">
                <Button.ContentTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Image Source="/Images/Menu.png" Width="20" Height="20" />
                        </StackPanel>
                    </DataTemplate>
                </Button.ContentTemplate>
            </Button>           
        </mah:WindowCommands>
    </mah:MetroWindow.RightWindowCommands>

状态栏

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" MinHeight="300"/>
            <RowDefinition Height="25"/>
        </Grid.RowDefinitions>     

        <!--状态栏-->
        <StatusBar Grid.Row="1">
            <StatusBarItem Content="Ready" Width="188" Margin="10 0 0 0"/>          
            <StatusBarItem Content="V1.0.0" HorizontalAlignment="Right" Width="120"/>
        </StatusBar>
    </Grid>

弹窗

Xaml:

    <mah:MetroWindow.Flyouts>
        <mah:FlyoutsControl>
            <mah:Flyout  Header="设置" Position="Left" IsModal="True" Width="450" Theme="Adapt" 
                         IsOpen="{Binding IsSettingFlyoutOpen}"   >
                <TabControl Style="{DynamicResource MahApps.Styles.TabControl.Animated}" 
                            TabStripPlacement="Left" 
                            mah:TabControlHelper.Underlined="SelectedTabItem" >
                    <TabItem Header="主题">                       
                    </TabItem>

                    <TabItem Header="关于">
                        <Grid >                            
                        </Grid>
                    </TabItem>
                </TabControl>
            </mah:Flyout>
        </mah:FlyoutsControl>
    </mah:MetroWindow.Flyouts>

 通过IsSettingFlyoutOpen控制窗口的显示与隐藏,代码如下:

Code:

        public bool IsSettingFlyoutOpen { get; set; }
        public void DoSetting()
        {
            IsSettingFlyoutOpen = !IsSettingFlyoutOpen;
        }

常用的功能大致介绍得差不多了,框架对常用控件的样式进行了修改,另外还增加了一些控件,增加的控件不多,常用的有:<mah:NumericUpDown />、<mah:SplitButton />、<mah:ToggleSwitch />等。

以上代码下载地址:NiceComponents · Bruce/Learn WPF - 码云 - 开源中国 (gitee.com)

具体的使用需要用户进一步去探索了,下载并运行官方开源代码是一个比较好的学习手段。