在我的自定义文本框中读取表单中的所有textBox

时间:2013-05-02 13:11:42

标签: c# wpf-controls

我在winform项目中使用自定义TextBox,我在自定义TextBox中添加了此属性:

private TextBox _nextControl;

public TextBox NextControl 
{
    set { _nextControl=value; }
    get { return _nextControl; }
}

我在自定义TextBox属性中使用属性TextBox获得了包含2 NextControl(textBox1和textBox2)的表单的结果。我可以在表格中看到所有TextBox es:

enter image description here

在这种情况下,属性NextControl会在我的表单中显示所有TextBox,以选择我的下一个控件。

但是当我想在我的新WPF costum TextBox中做同样的事情时,我得到了相同的条件(2 TextBox es,textBox1和textBox2):< / p>

enter image description here

为什么我没有相同的结果?以及如何在我的WPF项目中执行此操作?


更新:

有关更多说明,在我的winform项目中,我使用属性NextControl从UI属性中选择下一个控件。

protected override void OnKeyDown(KeyEventArgs e) 
{
    if(e.KeyCode==Keys.Down) 
        // select the next TextBox chosen in this TextBox option
        _nextControl.Select(); 
}

因为我已经可以在用户界面中选择下一个TextBox的名称,我不想使用额外的代码来执行此操作。

但是这在WPF中不起作用:我无法在我的窗口中看到我的TextBox es的名称NextControl(如果我选择属性类型= {{则自动在winform中1}})。

p.s。:我的自定义TextBox继承自TextBox


更新:

我使用示例项目的自定义System.Windows.Controls.TextBox [here]上传了一个winform项目,因为我希望WPF的行为相同。

我已更新此示例的链接。

3 个答案:

答案 0 :(得分:1)

快速查看代码告诉我你的Windows窗体用户控件与WPF不兼容,特别是Windows窗体中的keyDown事件解析参数“KeyEventArgs e”,这是一个System.Windows.Form.Key但是WPF解析“System.Windows.Input.Key”和WPF没有“文本框的Select()方法。此外,WPF以与WinForm完全不同的方式绑定控件,因此您的WinFromuserControl将无法在WPF格式中工作。

如果要在WPF表单中使用类似的行为,则必须编写一个WPF支持的行为。

答案 1 :(得分:1)

根据你的解释,我能理解的是,

  • 您正在使用具有Type TextBox
  • 的NextControl属性的自定义文本框类
  • 当您按向下箭头键
  • 时,您需要自定义文本框自动将焦点转移到下一个文本框
  • 您需要Visual Studio设计支持来选择哪个是所有CustomTextBox实例的下一个控件。
  • 早期在Winforms Visual Studio中支持从界面中选择可用的匹配类型。但现在在WPF中它不支持开箱即用。 (我们可以通过扩展属性网格来实现这一目标)
  • 在您的情况下,您可以将NextControl作为依赖项属性,并使用数据绑定实现与下一个控件的关系
  • 对于数据绑定,您需要单击属性名称末尾的属性网格中显示的方块,但是属性左侧的下拉列表。

希望您了解依赖项属性和WPF数据绑定。您需要使用的绑定是元素名称绑定。

答案 2 :(得分:1)

基于您正在寻找文本框(已知值)的事实,WinForms应用程序正在帮助您填充propertygrid。对于WinForms中大多数自己的控件都是如此,这次你需要自己在WPF中提供这些值。

根据herehere

回答了问题的部分内容

实现ICustomTypeDescriptor似乎很难,但实际上大多数函数只能返回TypeDescriptor的实现。

唯一有趣的是GetProperties,您可以在其中返回一个新的PropertyDescriptorCollection,其中包含从control.Children.OfType()返回的数组;