對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內置控件的屬性上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章