Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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
C# 另一个类中的WPF事件处理程序_C#_Wpf_Events_Event Handling - Fatal编程技术网

C# 另一个类中的WPF事件处理程序

C# 另一个类中的WPF事件处理程序,c#,wpf,events,event-handling,C#,Wpf,Events,Event Handling,我为一些自定义WPF控件构建了一系列事件处理程序。事件句柄根据包含的数据类型(电话号码、邮政编码、货币价值等)设置用户输入或离开文本框时显示的文本格式 现在我已经将C代码中的所有事件都直接附加到xaml。因为我开发了CAN控件,这意味着逻辑会重复很多次,如果我想更改程序范围的功能,我必须在事件代码所在的任何地方进行更改 我确信有一种方法可以将我所有的事件处理程序放在一个类中。有人能帮我指出正确的方向吗 我看过这篇文章:但我不确定它是否与我正在做的事情直接相关。我宁愿对现有的逻辑做一些小的修改,然

我为一些自定义WPF控件构建了一系列事件处理程序。事件句柄根据包含的数据类型(电话号码、邮政编码、货币价值等)设置用户输入或离开文本框时显示的文本格式

现在我已经将C代码中的所有事件都直接附加到xaml。因为我开发了CAN控件,这意味着逻辑会重复很多次,如果我想更改程序范围的功能,我必须在事件代码所在的任何地方进行更改

我确信有一种方法可以将我所有的事件处理程序放在一个类中。有人能帮我指出正确的方向吗

我看过这篇文章:但我不确定它是否与我正在做的事情直接相关。我宁愿对现有的逻辑做一些小的修改,然后将所有内容重写为命令

如果可能的话,我基本上想做这样的事情:

LostFocus="ExpandedTextBoxEvents.TextBox_LostFocus"
这样做很容易:

private void TextBoxCurrencyGotFocus(object sender, RoutedEventArgs e)
{
    ExpandedTextBoxEvents.TextBoxCurrencyGotFocus(sender, e);
}
private void TextBoxCurrencyLostFocus(object sender, RoutedEventArgs e)
{
    ExpandedTextBoxEvents.TextBoxCurrencyLostFocus(sender, e);
}
ExpandedTextBoxEvents.Subscribe="True"

但这就不那么优雅了

您可以创建一个依赖属性并在XAML中使用它,如下所示:

private void TextBoxCurrencyGotFocus(object sender, RoutedEventArgs e)
{
    ExpandedTextBoxEvents.TextBoxCurrencyGotFocus(sender, e);
}
private void TextBoxCurrencyLostFocus(object sender, RoutedEventArgs e)
{
    ExpandedTextBoxEvents.TextBoxCurrencyLostFocus(sender, e);
}
ExpandedTextBoxEvents.Subscribe="True"
dependency属性将存在于
ExpandedTextBoxeEvents
类中,Subscribe属性可以在设置为
True
时建立所有必要的事件订阅

这将给您留下一个单独的类,由XAML(或C#如果您愿意)在一个简单的语句中拉入。

是实现您想要的方法之一。我经常使用它们

随附物业代码:

公共类TextBoxFormatter
' ------------------------------------------------------
'定义FormatType附加属性
公共共享只读FormatTypeProperty作为DependencyProperty=_
从属属性。已注册(_
名称:=“FormatType”_
propertyType:=GetType(TextBoxFormatterType)_
ownerType:=GetType(TextBoxFormatter)_
defaultMetadata:=新的FrameworkPropertyMetadata(_
defaultValue:=TextBoxFormatterType.None_
PropertyChangedCallback:=新的PropertyChangedCallback(FormatTypePropertyChanged的地址)_
) _
)
' ------------------------------------------------------
'定义FormatType的“getter”和“setter”
作为TextBoxFormatterType的公共共享函数GetFormatType(ByVal目标作为DependencyObject)
target.GetValue(FormatTypeProperty)
端函数
公共共享子集合FormatType(ByVal目标作为DependencyObject,ByVal值作为TextBoxFormatterType)
target.SetValue(FormatTypeProperty,value)
端接头
' ------------------------------------------------------
'定义FormatType“PropertyChanged”事件处理程序
私有共享子格式TypePropertyChanged(ByVal目标作为DependencyObject,ByVal e作为DependencyPropertyChangedEventArgs)
如果CType(e.NewValue,TextBoxFormatterType)=TextBoxFormatterType.None,则
取消注册FormatTypeControl(目标)
其他的
注册表执行类型控制(目标)
如果结束
端接头
' ------------------------------------------------------
'定义的事件列表的集合
'FormatType“PropertyChanged”事件
私有共享_将FormatTypeControlDelegates注册为新字典(文本框、RoutedEventHandler)
' ------------------------------------------------------
'将控件注册为事件侦听器
(同时,附加到控件的LostFocus事件)
专用共享子注册表PerformATTypeControl(ByVal候选项作为DependencyObject)
Dim l_control=TryCast(候选,文本框)
如果l_控制不是什么,那么
Dim l_handler=新路由EventHandler(FormatTypeControl_LostFocus的地址)
_registeredFormatTypeControlDelegates.Add(l\u控件,l\u处理程序)
l_控件.AddHandler(TextBox.LostFocusEvent,l_处理程序)
如果结束
端接头
' ------------------------------------------------------
'将控件注销为事件侦听器
(另外,从控件的LostFocus事件中取消连接)
私有共享子UnregisterFormatTypeControl(ByVal候选项作为DependencyObject)
Dim l_control=TryCast(候选,文本框)
如果l_控件不是空的,并且还注册了FormattypeControlDelegates.ContainsKey(l_控件),那么
Dim l_处理程序=_registeredFormatTypeControlDelegates(l_控制)
l_控件.RemoveHandler(TextBox.LostFocusEvent,l_处理程序)
_registeredFormatTypeControlDelegates.Remove(l_控件)
如果结束
端接头
' ------------------------------------------------------
'在控件的LostFocus事件上,应用
”(您可以基于另一个事件应用该格式,
'如果使用TextChanged事件,请小心-它
'将激发用户是否已更改文本或
'您的代码已更改文本-可能会引入
(无限循环)
私有共享子格式TypeControl\u LostFocus(ByVal发送方作为对象,ByVal e作为RoutedEventArgs)
Dim l_textBox=TryCast(例如来源,textBox)
如果l_文本框不是空的,那么
Dim l_formatType=CType(l_textBox.GetValue(FormatTypeProperty),TextBoxFormatterType)
选择案例l\u格式类型
案例TextBoxFormatterType.SocialSecurityNumber
'将格式应用于l_文本框
(你希望社会保险号码是什么样子?)
案例TextBoxFormatterType.ZipCode
'将格式应用于l_文本框
(你想让邮政编码看起来像什么?)
Case TextBoxFormatterType.等
'将格式应用于l_文本框
结束选择
如果结束
端接头
末级
公共枚举TextBoxFormatterType
没有一个
ZipCode
社会保障