Silverlight:我可以将交互触发器放入资源中以便重用吗?

时间:2010-12-21 22:16:49

标签: 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框架,可能与此问题无关。

2 个答案:

答案 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交互设计模式