Wpf 如何为在itemsControl下动态创建的控件使用事件?
我在我的项目中有一个表单,其中包含通过使用类创建的控件。但这种方式存在一个问题,因为我将创建的任何控件都将在ItemsControl控件下,我不太确定如何访问我创建的任何控件的事件(例如textbox) 如果我想为我的文本框创建按键事件,代码中有一个错误: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
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