Silverlight:我可以将交互触发器放入资源以便重用吗?
问题描述:
我有一堆控件在多个用户控件和视图模型中使用相同的交互触发器。是否可以将这些触发器以某种方式置于资源字典中以供重用?下面是一个控件的样子。Silverlight:我可以将交互触发器放入资源以便重用吗?
<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框架,可能是不相关的这个问题。
答
不可能在资源中重新使用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}" />
据我认为,这种东西是不值得的。交互触发器的目的是为了赋予设计者而不是开发者权力。一位设计师并不担心“代码”中有一些重复。
答
我有有用的东西的情况下,你没有完全解决您的有关重复使用的互动问题,触发...
<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..
}
也许是更好的选择是使用像MVVM和EventToCommand交互的设计模式GalaSoft
我不舒服,但[x:Shared =“false”](http://msdn.microsoft.com/en-us/library/aa970778.aspx)可能有帮助。 – 2010-12-22 12:08:28