WPF -- 自定义控件 (CustomControl)(三 下)

邮差的信 提交于 2019-12-09 03:32:13

在这里,我们将通过一个借鉴开源项目框架来讲一讲如何创建自己的控件库,let's go!

1,创建一个控件库项目 鼠标右击项目解决方案 -->添加-->新建项目

选择WPF自定义控件库 修改名称,点击“确认”。

这是会生成一个如下图的工程:

在AssemblyInfo.cs文件中注意自动生成了ThemeInfo信息,这段代码作用是把CustomControl和Themes中的Generic.xaml关联起来,CustomControl1.cs中自动生成了如下代码:

  /// <summary>
    /// 按照步骤 1a 或 1b 操作,然后执行步骤 2 以在 XAML 文件中使用此自定义控件。
    ///
    /// 步骤 1a) 在当前项目中存在的 XAML 文件中使用该自定义控件。
    /// 将此 XmlNamespace 特性添加到要使用该特性的标记文件的根 
    /// 元素中: 
    ///
    ///     xmlns:MyNamespace="clr-namespace:WpfCustomControlLibrary1"
    ///
    ///
    /// 步骤 1b) 在其他项目中存在的 XAML 文件中使用该自定义控件。
    /// 将此 XmlNamespace 特性添加到要使用该特性的标记文件的根 
    /// 元素中: 
    ///
    ///     xmlns:MyNamespace="clr-namespace:WpfCustomControlLibrary1;assembly=WpfCustomControlLibrary1"
    ///
    /// 您还需要添加一个从 XAML 文件所在的项目到此项目的项目引用,
    /// 并重新生成以避免编译错误: 
    ///
    ///     在解决方案资源管理器中右击目标项目,然后依次单击
    ///     “添加引用”->“项目”->[选择此项目]
    ///
    ///
    /// 步骤 2)
    /// 继续操作并在 XAML 文件中使用控件。
    ///
    ///     <MyNamespace:CustomControl1/>
    ///
    /// </summary>
    public class CustomControl1 : Control
    {
        static CustomControl1()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
        }
    }
默认样式与Generic.xaml中进行关联。详见自定义控件 (三 上)
2,分层构建

为了层次分明,习惯上我们会把.cs文件放在单独文件夹下,结构如下图:

这里BaseControl文件夹存放基础控件类;Converters文件夹存放数据转化器;Resources存放基础控件样式或者颜色以及画刷等;Themes下存放自定义控件样式,这里一般把一个自定义控件单独放在一个资源文件中,然后在Generic.xaml中集中,如下图:
Generic.xaml中的资源集中代码如下:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:controls="clr-namespace:Yang.UI.Windows.Controls"
                    xmlns:shell="http://schemas.microsoft.com/winfx/2006/xaml/presentation/shell">
    
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/Yang.UI;component/Themes/BBCodeBlock.xaml" />
        <ResourceDictionary Source="/Yang.UI;component/Themes/ModernButton.xaml" />
        <ResourceDictionary Source="/Yang.UI;component/Themes/ModernToggleButton.xaml" />
        <ResourceDictionary Source="/Yang.UI;component/Themes/ModernDialog.xaml" />
        <ResourceDictionary Source="/Yang.UI;component/Themes/ModernFrame.xaml" />
        <ResourceDictionary Source="/Yang.UI;component/Themes/ModernMenu.xaml" />
        <ResourceDictionary Source="/Yang.UI;component/Themes/ModernProgressRing.xaml" />
        <ResourceDictionary Source="/Yang.UI;component/Themes/ModernTab.xaml" />
        <ResourceDictionary Source="/Yang.UI;component/Themes/ModernWindow.xaml" />
        <ResourceDictionary Source="/Yang.UI;component/Themes/TransitioningContentControl.xaml" />
    </ResourceDictionary.MergedDictionaries>
 
</ResourceDictionary>

这样在新建一个自定义控件时,可以在MyControl文件夹下创建一个单独的文件夹进行.cs文件的存放,在Themes文件夹下创建对应的***.xaml文件,并最终把***.xaml文件资源在Generic.xaml中进行资源集中。这里注意:<ResourceDictionary Source="/Yang.UI;component/Themes/ModernTab.xaml" />
Yang.UIModernTab.xaml所在的命名空间,/Themes/ModernTab.xaml为相对路径。具体自定义控件的依赖属性创建,路由事件创建以及命令创建等详见 自定义控件 (二 上)
3,应用控件库

在完成控件库创建后,需要在其他项目中引用时,首先添加DLL文件进行引用,一般一些基础资源会在控件库中统一集中,在引用时只需在项目中的APP.xaml文件中进行资源全局引用即可。
<Application x:Class="YangUI.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
         <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Yang.UI;component/Assets/ModernUI.xaml" />
                <ResourceDictionary Source="/Yang.UI;component/Assets/ModernUI.Light.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

下面在用到控件库中的控件时就可以在引用命名空间后直接用了,比如引用Link控件操作如下:
首先引用命名空间:
        xmlns:Yang="clr-namespace:Yang.UI.Presentation;assembly=Yang.UI"

然后引用:
 <YangUI:ModernWindow.TitleLinks>
        <Yang:Link DisplayName="Settings" Source="/Pages/Settings.xaml" />
        <Yang:Link DisplayName="Help" Source="https://github.com/firstfloorsoftware/mui/wiki" />
    </YangUI:ModernWindow.TitleLinks>
最后大家可以下载一个WPF开源框架研究一下:modern ui
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!