Мне кажется, что есть большая разница между 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 в кодировку.
Это моя проблема, хотя - я не хочу жестко задавать возвращаемое значение, я хочу, чтобы он принял значение экземпляра до того, как был запущен триггер. Так работают триггеры WPF/Silverlight. – cunningdave
Я думаю, что вы, возможно, говорите в смысле использования «VisualStateManager», в котором указано «Состояние» по умолчанию, так что он знает, что у него есть конкретный экземпляр для возврата обратно. Однако, когда вы используете триггеры как таковые в WPF или SL, я уверен, что вам всегда нужно будет управлять возвратом в другое состояние, поскольку по умолчанию не существует, поскольку используется при использовании состояний вместо триггеров, поскольку вы вручную меняете свои свойства, кроме как в случае неизменяемого объекта, где вы все равно не можете его изменить. –
Нет, это действительно не то, что я имею в виду. Я добавил тривиальный пример выше, чтобы проиллюстрировать нормальное поведение триггера. – cunningdave