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