[英]Creating a custom UI element in WPF
我的代碼中有幾個帶有Labels
TextBoxes
,它們使用以下XAML實現:
<DockPanel HorizontalAlignment="Right">
<TextBlock Foreground="Black" Padding="0,0,10,0">Serial Number:</TextBlock>
<TextBox Width="150" IsReadOnly="True" BorderBrush="Gainsboro" Height="20"></TextBox>
</DockPanel>
我可以通過以下方式減少一些復制的代碼:
<DockPanel HorizontalAlignment="Right">
<TextBlock Style="{StaticResource CstmTextBoxLbl}">Serial Number:</TextBlock>
<TextBox Style="{StaticResource CstmTextBox}"></TextBox>
</DockPanel>
但它仍然有點冗長。 有可能做這樣的事情:
<controls:CstmTextBox Style="{StaticResource CstmTextBox}" LabelText="Serial Number:" Text=""/>
CstmTextBox
將實現一次獲得相同視覺效果所需的任何XAML,並且我可以訪問代碼中的TextBlock
文本和TextBox
文本。 如
CstmTextBox textbox;
textbox.LabelText = "Serial Number:";
String some_text = textbox.Text;
textbox.Text = "....";
UserControl或CustomControl滿足您的需求。 這是CustomControl的代碼。
C#:
public class CstmTextBox : Control
{
public string LabelText
{
get
{
return (string)GetValue (LabelTextProperty);
}
set
{
SetValue (LabelTextProperty, value);
}
}
public static readonly DependencyProperty LabelTextProperty =
DependencyProperty.Register ("LabelText", typeof (string), typeof (CstmTextBox), new PropertyMetadata (string.Empty));
public string Text
{
get
{
return (string)GetValue (TextProperty);
}
set
{
SetValue (TextProperty, value);
}
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register ("Text", typeof (string), typeof (CstmTextBox), new PropertyMetadata (string.Empty));
}
XAML:
<Style TargetType="{x:Type controls:CstmTextBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type controls:CstmTextBox}">
<DockPanel HorizontalAlignment="Right">
<TextBlock Foreground="Black" Padding="0,0,10,0" Text="{TemplateBinding LabelText}"/>
<TextBox Width="150" IsReadOnly="True" BorderBrush="Gainsboro" Height="20" Text="{TemplateBinding Text}"/>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
將樣式添加到資源並使用新控件:
<controls:CstmTextBox LabelText="abcde" Text="1234"/>
將UserControl
添加到您的解決方案,並復制您要在其中重用的XAML。
如果將x:Name
設置為UserControl
...
<UserControl ... >
<DockPanel HorizontalAlignment="Right">
<TextBlock x:Name="SerialNumberTextBlock" Style="{StaticResource CstmTextBoxLbl}">Serial Number:</TextBlock>
<TextBox x:Name="SerialNumberTextBox" Style="{StaticResource CstmTextBox}"></TextBox>
</DockPanel>
</UserControl>
...你將能夠從外部訪問它們(代碼隱藏),如下所示:
CstmTextBox textbox;
textbox.SerialNumberTextBlock.Text = "Serial Number:";
String some_text = textbox.SerialNumberTextBox.Text;
textbox.SerialNumberTextBox.Text = "....";
但是,如果為要公開的屬性創建DependencyProperties,則會更好。 您可以在UserControl的代碼隱藏中定義這些屬性:
public string Text
{
get
{
return (string)GetValue(TextProperty);
}
set
{
SetValue (TextProperty, value);
}
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof (CstmTextBox));
然后將這些屬性綁定到UserControl中的控件:
<UserControl x:Name="Root" ... >
<DockPanel HorizontalAlignment="Right">
<TextBlock x:Name="SerialNumberTextBlock" Style="{StaticResource CstmTextBoxLbl}"
Text="{Binding LabelText, ElementName=Root}" />
<TextBox x:Name="SerialNumberTextBox" Style="{StaticResource CstmTextBox}"
Text="{Binding Text, ElementName=Root, Mode=TwoWay}" />
</DockPanel>
</UserControl>
這樣,您可以直接從外部設置屬性,無論是代碼隱藏,XAML還是綁定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.