4

假设我有一个 TextBox 控件,并且我想向它添加一个简单的字符串属性,而不必创建一个继承自常规 TextBox 控件的新 Textbox 控件。那可能吗?

例如,类似:

TextBox tx = new TextBox();
// I want something like the following
// tx.addProperty("propertyname", "properyvalue", typeof(string));

WPF/C#中是否有这样的东西,最简单的方法是什么,而不必创建一个继承自常规 TextBox 控件的新 Textbox 控件?

4

2 回答 2

5

您可以创建附加的依赖属性,并将其应用于任何类型的控件。例如,对于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、、、等。StringIdCanScrolling

于 2013-08-24T16:00:38.347 回答
4

通常,最好的方法是从 TextBox 控件继承。与 javascript 不同,C# 是一种静态类型语言,因此您不能只添加这样的属性。

由于 Textbox 控件是一个 DependencyObject,您也可以使用附加属性 - 请参阅 Anatoliy Nikolaev 上面/下面的答案。这可能会更好,具体取决于您希望如何使用该属性。

如果您只想添加一条信息,您可以使用 Textbox 的 Tag 属性,该属性专为此目的而设计,可以接受任何对象。如果要添加多条信息,可以将 Tag 属性设置为值字典。

于 2013-08-24T15:50:23.320 回答