如何将属性添加到现有类型/控件中
本文关键字:类型 控件 属性 添加 | 更新日期: 2023-09-27 18:28:58
假设我有一个TextBox控件,我想向它添加一个简单的字符串属性,而不必创建一个继承自常规TextBox控件的新TextBox控件。这可能吗?
例如:
TextBox tx = new TextBox();
// I want something like the following
// tx.addProperty("propertyname", "properyvalue", typeof(string));
WPF/C#中有这样的东西吗?在不必创建从常规Textbox控件继承的新Textbox控件的情况下,最简单的方法是什么?
您可以创建一个附加的依赖属性,并将其应用于任何类型的控件。例如,对于TextBlock
。下面是我的例子:
XAML
<Grid>
<TextBlock Name="SampleTextBlock" Width="200" Height="30"
Background="AntiqueWhite" Text="Sample TextBlock"
local:MyDependencyClass.MyPropertyForTextBlock="TestString" />
<StackPanel Width="100" Height="100" HorizontalAlignment="Left">
<Button Name="GetValueButton" Content="GetValueButton" Click="GetValue_Click" />
<Button Name="SetValueButton" Content="SetValueButton" Click="SetValue_Click" />
</StackPanel>
</Grid>
Code behind
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void GetValue_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(MyDependencyClass.GetMyPropertyForTextBlock(SampleTextBlock));
}
private void SetValue_Click(object sender, RoutedEventArgs e)
{
MyDependencyClass.SetMyPropertyForTextBlock(SampleTextBlock, "New Value");
MessageBox.Show(MyDependencyClass.GetMyPropertyForTextBlock(SampleTextBlock));
}
}
public class MyDependencyClass : DependencyObject
{
public static readonly DependencyProperty MyPropertyForTextBlockProperty;
public static void SetMyPropertyForTextBlock(DependencyObject DepObject, string value)
{
DepObject.SetValue(MyPropertyForTextBlockProperty, value);
}
public static string GetMyPropertyForTextBlock(DependencyObject DepObject)
{
return (string)DepObject.GetValue(MyPropertyForTextBlockProperty);
}
static MyDependencyClass()
{
PropertyMetadata MyPropertyMetadata = new PropertyMetadata(string.Empty);
MyPropertyForTextBlockProperty = DependencyProperty.RegisterAttached("MyPropertyForTextBlock",
typeof(string),
typeof(MyDependencyClass),
MyPropertyMetadata);
}
}
或者您可以使用属性Tag
,它只是用来存储附加信息的。但有时,这处房产可能会被其他目标占用,也可能因为他的名字而无法持有。用直观的名称创建属性要好得多,例如:ValueForAnimation
、StringId
、CanScrolling
等。
通常,最好的方法是从TextBox控件继承。与javascript不同,C#是一种静态类型的语言,因此不能只添加这样的属性。
由于Textbox控件是一个DependencyObject,您也可以使用附加的属性-请参阅Anatoliy Nikolaev在上面/下面的回答。这可能会更好,具体取决于您希望如何使用该属性。
如果你只想添加一条信息,你可以使用Textbox的Tag属性,它是为此目的设计的,可以接受任何对象。如果要添加多条信息,可以将Tag属性设置为值的字典。