Silverlight: Могу ли я добавить триггеры взаимодействия в ресурсы для повторного использования? - PullRequest
4 голосов
/ 22 декабря 2010

У меня есть несколько элементов управления, использующих идентичные триггеры взаимодействия для нескольких пользовательских элементов управления и моделей представления. Можно ли как-то поместить эти триггеры в словарь ресурсов для повторного использования? Вот пример того, как может выглядеть элемент управления.

       <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 ]

3 голосов
/ 22 декабря 2010

Невозможно повторно использовать один экземпляр 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}" />

По моему мнению, такого рода вещи не стоят того.Материал «Interaction Triggers» действительно нацелен на расширение возможностей дизайнера, а не разработчика.Дизайнер не так беспокоится, что в «коде» есть какое-то повторение.

1 голос
/ 22 декабря 2011

У меня есть кое-что полезное на случай, если вам не удастся полностью решить проблему повторного использования триггеров взаимодействия ...

<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 Interactions от GalaSoft

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...