2010-12-21 66 views
4

我有一堆控件在多个用户控件和视图模型中使用相同的交互触发器。是否可以将这些触发器以某种方式置于资源字典中以供重用?下面是一个控件的样子。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框架,可能是不相关的这个问题。

回答

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}" /> 

据我认为,这种东西是不值得的。交互触发器的目的是为了赋予设计者而不是开发者权力。一位设计师并不担心“代码”中有一些重复。

+0

我不舒服,但[x:Shared =“false”](http://msdn.microsoft.com/en-us/library/aa970778.aspx)可能有帮助。 – 2010-12-22 12:08:28

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.. 
} 

也许是更好的选择是使用像MVVM和EventToCommand交互的设计模式GalaSoft

相关问题