7

在我看来,在 Interactivity 命名空间中找到的 Blend-style与 WPF 中通过 Styles、s 等可用Trigger的经典s 之间存在重大差异(我认为这可能也适用于 SilverLight)。TriggerControlTemplate

在 WPF 中,当您Trigger使用 Setter 设置 a 时,您会得到两种行为:如果满足触发条件,则应用 Setter。但是,一旦不再满足触发器,就会恢复之前的值。这在编程 UI 时非常有用。

我尝试使用 Blend 方式编写类似的代码:我将 ChangePropertyAction 应用到我的控件,并使用绑定到我的 ViewModelDataTrigger让它触发交互性。DataTrigger

<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 值翻转为 false 时,原始不透明度为 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。

4

3 回答 3

2

如其他答案所述,触发器设置的值似乎没有自动反转Interaction,但您可以使用显式取消设置触发器设置的值DependencyProperty.UnsetValue,从而使依赖属性当前值恢复为以前的值,如下所示:

<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="{x:Static DependencyProperty.UnsetValue}"/>
  </ei:DataTrigger>
</i:Interaction.Triggers>

免责声明:我实际上只使用xaml 行为的新开源打包在 .NET Core 3.1 上对此进行了测试。保留经典的 i/ei 命名空间以与原始问题保持一致。

于 2020-01-04T10:05:19.440 回答
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>
于 2013-03-06T21:26:23.880 回答
1

是的,你必须把这两个条件都用这个 Blend 触发器,没有返回默认值。另一方面,使用混合触发器,您可以调用方法操作,这对动画非常有用。此外,使用 Blend 触发器,您还有 ControlStoryBoard 动作等等,但在您描述的情况下,您最好使用“正常”触发器。

于 2018-10-12T22:46:18.457 回答