2013-03-06 3 views
5

Мне кажется, что есть большая разница между Blend-стилем Trigger ов, найденным в пространстве имен Интерактивности и классические Trigger s доступна через стили, ControlTemplate с, и т.д., в WPF (I предположил, что это, вероятно, относится и к SilverLight).смеси Trigger против WPF Trigger

В WPF, когда вы устанавливаете Trigger с помощью Setter, вы получаете два поведения: если выполняется условие триггера, применяется Setter. Однако, как только Trigger больше не выполняется, предыдущее значение восстанавливается. Это чрезвычайно полезно при программировании пользовательского интерфейса.

Я пытался кодировать DataTrigger так же с помощью наложения так: я применил ChangePropertyAction к моему контролю, и оно инициировало от интерактивности DataTrigger с помощью привязки к моему ViewModel.

<Rectangle x:Name="SecondaryHighlightBackground" Fill="#FF505050"> 
      <i:Interaction.Triggers> 
       <ei:DataTrigger Binding="{Binding IsHighlighted}" Value="Value"> 
        <ei:ChangePropertyAction PropertyName="Opacity" Value="0.5"/> 
       </ei:DataTrigger> 
      </i:Interaction.Triggers> 
... 
</Rectangle> 

Так это работало, как ожидалось ... кроме того, я был поражен, обнаружив, что, когда я переверните значение IsHighlighted ложь, что первоначальный Opacity 0% не восстанавливается (я установил, что пониже). Чтобы перепроверить это, я написал этот пример для проверки:

<Window x:Class="TestWpfApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Name="Window" 
     Title="MainWindow" 
     Width="640" 
     Height="480"> 

    <Grid x:Name="LayoutRoot"> 
     <Button Name="button1" 
       Width="173" 
       Height="57" 
       Margin="10,10,0,0" 
       HorizontalAlignment="Left" 
       VerticalAlignment="Top"> 
      <Button.Style> 
       <Style TargetType="Button"> 
        <Setter Property="Content" Value="foo" /> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding IsMouseOver, ElementName=button1}" Value="True"> 
          <Setter Property="Content" Value="bar" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Button.Style> 
     </Button> 
    </Grid> 
</Window> 

Ожидаемое поведение является то, что если вы, если навести курсор мыши на кнопку, изменения содержания в «бар». Перемещение мыши приводит к восстановлению содержимого до «Foo», как указано в стиле. Стиль задает содержание, чтобы избежать проблемы с приоритетом свойств.

Мой вопрос: Действительно ли двухстороннее срабатывание просто отсутствует в расширениях Blend, или есть способ сделать это как-то?

Я что-то упустил? Я думал, что это была самая главная причина триггеров, что у них есть эта двухсторонняя функциональность. Я хотел бы продолжать использовать интерактивные действия Blend, потому что я считаю их полезными и интуитивными, но такое свойство заставляет меня снова переписывать XAML в кодировку.

ответ

1

Если я правильно понимаю, вам просто нужно предоставить рассмотрение другого значения в вашем триггере, так как оно не будет делать это по умолчанию, поскольку вы взяли под контроль это условие. Что-то вроде;

<i:Interaction.Triggers> 
    <ei:DataTrigger Binding="{Binding IsHighlighted}" Value="True"> 
     <ei:ChangePropertyAction PropertyName="Opacity" Value="0.5"/> 
    </ei:DataTrigger> 
    <ei:DataTrigger Binding="{Binding IsHighlighted}" Value="False"> 
     <ei:ChangePropertyAction PropertyName="Opacity" Value="0"/> 
    </ei:DataTrigger> 
</i:Interaction.Triggers> 
+0

Это моя проблема, хотя - я не хочу жестко задавать возвращаемое значение, я хочу, чтобы он принял значение экземпляра до того, как был запущен триггер. Так работают триггеры WPF/Silverlight. – cunningdave

+0

Я думаю, что вы, возможно, говорите в смысле использования «VisualStateManager», в котором указано «Состояние» по умолчанию, так что он знает, что у него есть конкретный экземпляр для возврата обратно. Однако, когда вы используете триггеры как таковые в WPF или SL, я уверен, что вам всегда нужно будет управлять возвратом в другое состояние, поскольку по умолчанию не существует, поскольку используется при использовании состояний вместо триггеров, поскольку вы вручную меняете свои свойства, кроме как в случае неизменяемого объекта, где вы все равно не можете его изменить. –

+0

Нет, это действительно не то, что я имею в виду. Я добавил тривиальный пример выше, чтобы проиллюстрировать нормальное поведение триггера. – cunningdave