4

TextBox在一个 winform 项目中使用自定义,我在我的自定义中添加了这个属性TextBox

private TextBox _nextControl;

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

我在我的自定义属性中得到了一个带有 2 TextBox(textBox1 和 textBox2)的表单的结果,其中的属性是;我可以在表格中看到所有 es:TextBoxNextControlTextBox

在此处输入图像描述

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

但是当我想在我的新 WPF 服装中做同样的事情时,TextBox我得到了相同的条件(2 TextBoxes、textBox1 和 textBox2):

在此处输入图像描述

为什么我没有相同的结果?以及如何在我的 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在 UI 中选择下一个的名称,所以我不想使用额外的代码来执行此操作

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

ps:我的自定义TextBox继承自System.Windows.Controls.TextBox.


更新:

TextBox 我用示例项目的自定义[ here ]上传了一个 winform 项目,因为我希望 WPF 可以表现相同。

我已经更新了这个示例的链接。

4

3 回答 3

1

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

您的问题的一部分是如何在此处此处得到回答的

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

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

于 2013-05-13T21:43:49.240 回答
1

从你的解释我能理解的是,

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

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

于 2013-05-10T15:00:41.230 回答
1

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

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

于 2013-05-09T16:02:53.617 回答