WPF - 自定义控件

  • 简述

    WPF 应用程序允许创建自定义控件,这使得创建功能丰富且可自定义的控件变得非常容易。当 Microsoft 提供的所有内置控件都不满足你的条件或你不想为第三方控件付费时,将使用自定义控件。
    在本章中,您将学习如何创建自定义控件。在开始查看自定义控件之前,让我们先快速浏览一下用户控件。
  • 用户控制

    用户控件提供了一种收集和组合不同内置控件并将其打包到可重用 XAML 中的方法。用户控件用于以下方案 −
    • 如果控件由现有控件组成,即,您可以创建由多个已存在的控件组成的单个控件。
    • 如果控件不需要支持主题。用户控件不支持复杂的自定义、控件模板和难以设置样式。
    • 如果开发人员更喜欢使用代码隐藏模型编写控件,其中有视图,然后是事件处理程序的直接代码隐藏。
    • 您不会在应用程序之间共享您的控制权。

    让我们转到用户控件的示例,并按照下面给出的步骤操作。
    • 创建一个新的 WPF 项目,然后右键单击解决方案并选择“添加新项>...”
    用户控件
    • 将打开以下窗口。现在,选择“用户控件 (WPF)”并将其命名为“我的用户控件”。
    用户控件中的新项
    • 单击“添加”按钮,您将看到将在解决方案中添加两个新文件(“我的用户控件”和“我的用户控件.cs”)。
    下面是 XAML 代码,其中使用“我的用户控制”文件中的某些属性创建了一个按钮和一个文本框。
    
    <UserControl x:Class = "WPFUserControl.MyUserControl" 
       xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"  
       xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"  
       mc:Ignorable = "d" d:DesignHeight = "300" d:DesignWidth = "300"> 
       
       <Grid> 
          <TextBox Height = "23"  
             HorizontalMoognment = "Left"  
             Margin = "80,49,0,0" Name = "txtBox"  
             VerticalMoognment = "Top" Width = "200" /> 
             
          <Button Content = "Click Me"  
             Height = "23" HorizontalMoognment = "Left"  
             Margin = "96,88,0,0" Name = "button"  
             VerticalMoognment = "Top" Click = "button_Click" />    
       </Grid>
       
    </UserControl>
    
    下面给出的是 MyUser控件中按钮单击事件的 C# 代码.cs更新文本框的文件。
    
    using System; 
    using System.Windows; 
    using System.Windows.Controls; 
     
    namespace WPFUserControl {
       /// <summary>
          /// Interaction logic for MyUserControl.xaml 
       /// </summary> 
       
       public partial class MyUserControl : UserControl { 
       
          public MyUserControl() { 
             InitializeComponent(); 
          }  
          
          private void button_Click(object sender, RoutedEventArgs e) { 
             txtBox.Text = "You have just clicked the button"; 
          } 
       } 
    }
    
    下面是在主窗口.xaml 中用于添加用户控件的实现。
    
    <Window x:Class = "XAMLUserControl.MainWindow" 
       xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:control = "clr-namespace:WPFUserControl" 
       Title = "MainWindow" Height = "350" Width = "525"> 
       
       <Grid> 
          <control:MyUserControl/> 
       </Grid> 
       
    </Window> 
    
    编译并执行上述代码时,将生成以下窗口。
    用户控件的输出
    单击“单击我”按钮后,您会注意到文本框中的文本已更新。
    在用户控件中单击的按钮
  • 自定义控件

    自定义控件是一个类,它提供自己的样式和模板,这些样式和模板通常在 generic.xaml 中定义。自定义控件用于以下方案 −
    • 如果该控件不存在,则必须从头开始创建它。
    • 如果要通过添加额外的属性或额外的功能来扩展或向预先存在的控件添加功能,以适合您的特定方案。
    • 如果您的控件需要支持主题和样式。
    • 如果要跨应用程序共享控件。

    让我们通过一个示例来了解自定义控件的工作原理。创建一个新的 WPF 项目,然后右键单击解决方案并选择“添加新项>...”
    自定义控件
    它将打开以下窗口。现在,选择“自定义控件 (WPF)”并将其命名为“我的自定义控件”
    添加新项目
    单击“添加”按钮,你将看到将在解决方案中添加两个新文件(“主题/通用.xaml”和“我的自定义控件.cs”)。
    下面是为通用 .xaml 文件中的自定义控件设置样式的 XAML 代码。
    
    <ResourceDictionary 
       xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:local = "clr-namespace:WPFCustomControls">  
       
       <Style TargetType = "{x:Type local:MyCustomControl}"
          BasedOn = "{StaticResource {x:Type Button}}"> 
          <Setter Property = "Background" Value = "LightSalmon" /> 
          <Setter Property = "Foreground" Value = "Blue"/> 
       </Style> 
       
    </ResourceDictionary>
    
    Here is the C# code for MyCustomControl class which is inherited from the button class and in constructor it overrides the metadata.
    
    using System; 
    using System.Windows; 
    using System.Windows.Controls; 
     
    namespace WPFCustomControls { 
       public class MyCustomControl : Button { 
       
          static MyCustomControl() { 
             DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new
                FrameworkPropertyMetadata(typeof(MyCustomControl))); 
          } 
          
       } 
    } 
    
    下面是 C# 中的自定义控件单击事件实现,它更新文本块的文本。
    
    using System; 
    using System.Windows; 
    using System.Windows.Controls;
    namespace WPFCustomControls { 
       /// <summary> 
          /// Interaction logic for MainWindow.xaml 
       /// </summary> 
       
       public partial class MainWindow : Window { 
       
          public MainWindow() { 
             InitializeComponent(); 
          }  
          
          private void customControl_Click(object sender, RoutedEventArgs e) { 
             txtBlock.Text = "You have just click your custom control"; 
          }
          
       } 
    }
    
    下面是在主窗口.xaml 中实现的,用于添加自定义控件和文本块。
    
    <Window x:Class = "WPFCustomControls.MainWindow" 
       xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:control = "clr-namespace:WPFCustomControls" 
       Title = "MainWindow" Height = "350" Width = "604"> 
       
       <StackPanel> 
          <control:MyCustomControl x:Name = "customControl"  
             Content = "Click Me" Width = "70" 
             Margin = "10" Click = "customControl_Click"/> 
             
          <TextBlock Name = "txtBlock"  
             Width = "250" Height = "30"/> 
       </StackPanel>
       
    </Window> 
    
    当您编译并执行上述代码时,它将生成以下窗口,其中包含一个自定义控件,该控件是一个自定义按钮。
    代码输出
    单击自定义按钮后,您将看到文本块内的文本已更新。
    自定义按钮