Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何为在itemsControl下动态创建的控件使用事件?_Wpf_Vb.net - Fatal编程技术网

Wpf 如何为在itemsControl下动态创建的控件使用事件?

Wpf 如何为在itemsControl下动态创建的控件使用事件?,wpf,vb.net,Wpf,Vb.net,我在我的项目中有一个表单,其中包含通过使用类创建的控件。但这种方式存在一个问题,因为我将创建的任何控件都将在ItemsControl控件下,我不太确定如何访问我创建的任何控件的事件(例如textbox) 如果我想为我的文本框创建按键事件,代码中有一个错误: Handles clause requires a WithEvents variable defined in the containing type or one of its base types. 我只是假设这是因为我的ItemsC

我在我的项目中有一个表单,其中包含通过使用类创建的控件。但这种方式存在一个问题,因为我将创建的任何控件都将在ItemsControl控件下,我不太确定如何访问我创建的任何控件的事件(例如textbox)

如果我想为我的文本框创建按键事件,代码中有一个错误:

Handles clause requires a WithEvents variable defined in the containing type or one of its base types.

我只是假设这是因为我的ItemsControl,因为我在尝试从ItemsControl中访问控件的属性时遇到了相同的问题,这是一个需要修复的噩梦。引发错误的真正原因是什么?

您需要使用
AddHandler
关键字动态订阅事件:

Dim tb As New TextBox
...
AddHandler tb.TextChanged, AddressOf tb_TextChanged
其中
tb\u TextChanged
是处理事件的方法:

Private Sub tb_TextChanged(ByVal sender As Object, ByVal e As TextChangedEventArgs)

    ...

End Sub

如果您需要取消订阅,请使用
RemoveHandler
关键字。

您的问题是试图将此功能放置在错误的位置

包含
ItemsControl
窗口
后面的代码不适合放置影响/关注在
ItemsControl
中反复使用的特定UI元素的代码。您需要隔离UI的“部分”,并创建模块化、独立的功能/视觉单元,这些功能/视觉单元可以重用并独立于其“周围”环境工作

在这种情况下,您必须将
数据模板
(XAML)中的
文本框
替换为另一个UI元素,该元素的性能类似于文本框,但只允许数字/屏蔽输入

有三种不同的方法:

1-替换WPF工具包中的
文本框

2-为包含
文本框
并使用代码隐藏执行仅数字输入功能的替换
文本框

3-将继承自
TextBox
并自行在中执行输入验证的
文本框替换为

方法2和方法3之间的区别在于,
UserControl
是一个由XAML+代码隐藏组成的UI组合块,它可以包含任何其他UI元素,而
自定义控件
是从控件(例如
TextBox
)派生的仅代码类(没有XAML/“Lookless”)这需要一个能正常工作的机器


请注意,这两种方法都不涉及将代码放在包含
itemsControl
的窗口后面。这只是一个分离关注点和适当封装功能的问题。

如何以这种方式使用eventArgs?我想做的是创建一个文本框,它只允许数字,但如果没有eventarg传递给function@Criel,事件参数由引发事件的控件传递。您所要做的就是在事件处理程序中接收EventArgs。
修复它是一场噩梦
-WPF对您来说将是一场“噩梦”,直到您放弃winforms思维,创建适当的ViewModel并使用适当的数据绑定。你在寻找什么事件,处理它/处理它后你希望实现什么?最初,我通过将它们从工具箱拖放到我的表单上创建表单,直到我阅读了你的一篇文章,其中解释了你可以“动态”创建它们并将它们绑定到表单,然后我将它们绑定到一个只有几个控件的非常小的表单上。使用这个表单,我只有一个标签、textbox和按钮,因为WPF中没有MaskedTextBox控件,所以我正在为textbox创建逻辑。最初,访问控件的属性是一件令人头痛的事情(因为在ItemsControl下),我必须枚举每个子控件才能获得属性。我将研究ViewModel