2010-12-21 62 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

相關問題