对wpf 的入门记录总结-- 用户控件和自定义控件

本文介绍了WPF中的用户控件和自定义控件。用户控件基于UserControl类,用于封装和重用功能,而自定义控件则提供更底层的定制。通过示例展示了如何创建一个限制输入字符数的用户控件,并解释了如何在WPF窗口中使用该控件,强调了属性绑定在其中的作用。

用户控件

WPF 用户控件继承UserControl类,其行为与WPF窗口非常相似:有一个XAML文件和一个代码后置文件。

在XAML文件中,您可以添加现有的WPF控件以创建所需的外观,然后将其与代码后置文件中的代码组合,以实现所需的功能。 然后,WPF将允许您在应用程序的一个或多个位置嵌入此功能集,从而允许您轻松地在应用程序中分组和重用功能。

自定义控件

自定义控件比用户控件更低级别。 创建自定义控件时,将根据需要的深度继承现有类。 在许多情况下,您可以继承其他WPF控件的Control类(例如TextBox),但如果您需要更深入,则可以继承FrameworkElement甚至UIElement。 你越深入,你得到的控制就越多,继承的功能就越少。

自定义控件的外观通常通过主题文件中的样式进行控制,而用户控件的外观将遵循应用程序其余部分的外观。 这也突出了用户控件和自定义控件之间的主要区别之一:自定义控件可以设置样式/模板,而用户控件则不能。

创建用户控件

我们将创建一个有用的用户控件,能够将TextBox中的文本数量限制为特定数量的字符,同时向用户显示已使用的字符数以及可以使用的字符数。 这很简单,并且在许多Web应用程序(如Twitter)中使用。 将这个功能添加到常规窗口很容易,但由于它可能在应用程序的多个位置使用,因此将它包装在一个易于重用的UserControl中是有意义的。

<UserControl x:Class="用户控件.UserControl1"
             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" 
             xmlns:local="clr-namespace:用户控件"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <Label Content="{Binding Title}" />
        <Label Grid.Column="1">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding ElementName=txtLimitedInput, Path=Text.Length}" />
                <TextBlock Text="/" />
                <TextBlock Text="{Binding MaxLength}" />
            </StackPanel>
        </Label>
        <TextBox MaxLength="{Binding MaxLength}" Grid.Row="1" Grid.ColumnSpan="2" Name="txtLimitedInput" ScrollViewer.VerticalScrollBarVisibility="Auto" TextWrapping="Wrap" />
    </Grid>
</UserControl>

DesignHeight和DesignWidth属性,它们在设计时控制用户控件的大小(在运行时,用户控件的大小将由容纳它的容器决定)



using System.Windows.Controls;

namespace 用户控件
{
    /// <summary>
    /// UserControl.xaml 的交互逻辑
    /// </summary>
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
            this.DataContext = this;
        }

        public string Title { get; set; }

        public int MaxLength { get; set; }
    }

}

代码分析:一个有两列两行的Grid。 Grid的上半部分包含两个标签,一个显示标题,另一个显示统计数据。 它们中的每一个都使用数据绑定来获取所需的所有信息,Title和MaxLength来自后置代码的属性,我们已将其定义为常规类的常规属性。

所有这些绑定,我们不需要任何C#代码来更新标签或在TextBox上设置MaxLength属性 - 相反,我们只是直接绑定到属性。
其含义为:wpf的内置控件绑定到用户控件的属性上。

使用用户控件

通过在Window的XAML代码的顶部添加对UserControl所在的命名空间的引用来实现(哪怕命名空间相同)。
我这边是同一个命名空间,直接local已经有了,不能省略。

<Window x:Class="用户控件.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:用户控件"
        mc:Ignorable="d"
       Title="LimitedInputSample" Height="200" Width="300">
    <Grid Margin="10">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <local:UserControl1 Title="Enter title:" MaxLength="30" Height="50" />
        <local:UserControl1 Title="Enter description:" MaxLength="140" Grid.Row="1" />

    </Grid>
</Window>

使用local:UserControl1 就可以引用自定义控件,并且设置它的属性。
有了它,我们可以在一行代码中重用这整个功能,如本例所示,在window窗口中有两个限制文本输入的控件。
在这里插入图片描述
表面上看并没有任何cs代码来进行逻辑上的判断限定,控件就能限制最大输入字符,事实上全是textbox的MaxLength="{Binding MaxLength}"起作用。
整个流程大概是:window调用户控件,把需要的值通过属性方式传递过去,而用户控件的属性接受到值,再绑定到wpf内置控件的属性上。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值