自定义WPF控件,以向TextBox添加int属性

时间:2012-12-11 18:04:54

标签: c# wpf custom-controls

我想要一个额外的WPF控件,它会向TextBox类添加int属性。我试过Project>添加新项>自定义控件(WPF)。这给了我一个新的控件的新cs文件。我尝试让这个新类继承TextBox类,然后在public int number { get; set; }内添加static CustomTextBox(),但显然这不是正确的语法。

我需要的TextBox是在代码中动态创建的,而不是在XAML中。

以下是我尝试实施John Gardner的答案:

public static readonly DependencyProperty Number = DependencyProperty.RegisterAttached(
        "number",
        typeof(TextBox),
        typeof(int),
        new PropertyMetadata(false)
        );
    public static void SetNumber(UIElement element, TextBox value)
    {
        element.SetValue(Number, value);
    }
    public static TextBox GetNumber(UIElement element)
    {
        return (TextBox)element.GetValue(Number);
    }

我在MainWindow类中添加了这个。它似乎没有为我的TextBox提供额外的Number属性。

2 个答案:

答案 0 :(得分:1)

需要一个新控件吗?您可能最好使用附加属性。然后根本没有新的控制。

http://msdn.microsoft.com/en-us/library/cc265152(v=VS.95).aspx

<强>更新 附加属性不会直接向文本框添加属性,您可以像

一样访问它
YourClass.SetNumber( textbox, value );
int value = YourClass.GetNumber( textbox );

或在xaml中,

    <TextBox YourClass.Number="1"/>

你的属性在其字符串定义中也应该是“Number”,你有“数字”。你的Get / Set调用应该有一个int值,而不是一个文本框。

答案 1 :(得分:1)

您可以创建TextBox的子类并向其添加单个int属性。应该这样做我猜。

看一下这段代码,看一下如何做的例子:

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();

        panel.Children.Add(new MyTextBox { Number = 123 });
        panel.Children.Add(new MyTextBox { Number = 321 });
        panel.Children.Add(new MyTextBox { Number = 456 });
        panel.Children.Add(new MyTextBox { Number = 654 });
    }

    private void click(object sender, RoutedEventArgs e)
    {
        var myTextBoxes = panel.Children.OfType<MyTextBox>();
        var numbers = string.Empty;
        myTextBoxes.ToList().ForEach(p => numbers += p.Number + Environment.NewLine);
        MessageBox.Show(numbers);
    }
}

//Subclass of TextBox that just adds one property
public class MyTextBox : TextBox
{
    public int Number { get; set; }
}

..而XAML只有面板和一个按钮:

<StackPanel Name="panel">
    <Button Content="Show numbers" Click="click" />
</StackPanel>