我有一堆控件在多个用户控件和视图模型中使用相同的交互触发器。是否有可能将这些触发器以某种方式放入资源字典中以供重用?以下是控件的外观示例。
<TextBox x:Name="FirstName" Grid.Row="1" Grid.Column="1">
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyDown">
<cal:ActionMessage MethodName="KeyPressed" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
<TextBox x:Name="Initial" Grid.Row="1" Grid.Column="1">
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyDown">
<cal:ActionMessage MethodName="KeyPressed" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
<TextBox x:Name="LastName" Grid.Row="1" Grid.Column="1">
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyDown">
<cal:ActionMessage MethodName="KeyPressed" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
cal:
命名空间来自Caliburn.Micro MVVM框架,可能与此问题无关。
答案 0 :(得分:3)
无法在资源中重用Interaction.Triggers
的单个实例,因为它会附加一个控件。该附件成为其状态的一部分,因此多个控件不能共享单个实例。
您需要在模板中包含Interaction.Triggers
,以便创建多个实例。我猜这样的事情可能会起作用,(警告航空代码)。
<UserControl.Resources>
<DataTemplate x:key="MyTextBox">
<TextBox>
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyDown">
<cal:ActionMessage MethodName="KeyPressed" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
</DataTemplate>
</UserControl.Resources>
...
<ContentPresenter x:Name="FirstName" Grid.Row="1" Grid.Column="1" ContentTemplate="{StaticResource MyTextBox}" />
<ContentPresenter x:Name="Initial" Grid.Row="1" Grid.Column="1" ContentTemplate="{StaticResource MyTextBox}" />
<ContentPresenter x:Name="LastName" Grid.Row="1" Grid.Column="1" ContentTemplate="{StaticResource MyTextBox}" />
我认为这种东西不值得。交互触发器的内容实际上旨在为设计人员而不是开发人员提供支持。设计师并不担心“代码”中会有一些重复。
答案 1 :(得分:1)
我有一些有用的东西,如果您没有完全解决重新使用交互触发器的问题......
<TextBox x:Name="FirstName" KeyDown="_KeyDown">
...
private void TextBlock_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
Here goes something you wanna reuse for all your TextBox controls..
}
也许更好的选择是使用GalaSoft之类的MVVM和EventToCommand交互设计模式