混合触发器与WPF触发器

时间:2013-03-06 21:13:42

标签: wpf xaml expression-blend datatrigger

在我看来,在Interactivity命名空间中找到的Blend风格Trigger与通过样式Trigger s提供的经典ControlTemplate之间存在重大差异,等等,在WPF中(我认为这也可能适用于SilverLight)。

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

我尝试使用Blend方式类似地对DataTrigger进行编码:我将ChangePropertyAction应用于我的控件,并使用绑定到我的ViewModel来触发Interactivity 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>

预期的行为是,如果您将鼠标悬停在按钮上,则内容将更改为“bar”。移动鼠标将内容恢复为'Foo',如Style所指定。样式设置内容以避免属性优先问题。

我的问题是: Blend扩展中是否真的缺少双向触发,还是有办法以某种方式启用它?

我错过了什么吗?我认为这是触发器的重点,它们具有这种双向功能。我想继续使用Blend交互行为,因为我觉得它们很有用且直观,但这种事情迫使我重新编写XAML。

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

是的,您必须同时使用这两个Blend触发器来设置两个条件,并且不返回默认值。另一方面,您可以使用Blend Triggers来调用CallMethodAction,这对于动画非常有用。同样,使用Blend触发器,您还可以执行ControlStoryBoard操作,还有更多操作,但在上述情况下,使用“正常”触发器会更好。

答案 2 :(得分:1)

如其他答案所述, libSDL2pp.so.8 (libc6,x86-64) => /usr/lib/libSDL2pp.so.8 libSDL2pp.so (libc6,x86-64) => /usr/lib/libSDL2pp.so libSDL2_ttf-2.0.so.0 (libc6,x86-64) => /usr/lib/libSDL2_ttf-2.0.so.0 libSDL2_ttf-2.0.so.0 (libc6) => /usr/lib32/libSDL2_ttf-2.0.so.0 libSDL2_mixer-2.0.so.0 (libc6,x86-64) => /usr/lib/libSDL2_mixer-2.0.so.0 libSDL2_mixer-2.0.so.0 (libc6) => /usr/lib32/libSDL2_mixer-2.0.so.0 libSDL2_image-2.0.so.0 (libc6,x86-64) => /usr/lib/libSDL2_image-2.0.so.0 libSDL2_image-2.0.so.0 (libc6) => /usr/lib32/libSDL2_image-2.0.so.0 libSDL2-2.0.so.0 (libc6,x86-64) => /usr/lib/libSDL2-2.0.so.0 libSDL2-2.0.so.0 (libc6) => /usr/lib32/libSDL2-2.0.so.0 libSDL2-2.0.so (libc6,x86-64) => /usr/lib/libSDL2-2.0.so libSDL2-2.0.so (libc6) => /usr/lib32/libSDL2-2.0.so libSDL_ttf-2.0.so.0 (libc6,x86-64) => /usr/lib/libSDL_ttf-2.0.so.0 libSDL_ttf-2.0.so.0 (libc6) => /usr/lib32/libSDL_ttf-2.0.so.0 libSDL_sound-1.0.so.1 (libc6,x86-64) => /usr/lib/libSDL_sound-1.0.so.1 libSDL_net-1.2.so.0 (libc6,x86-64) => /usr/lib/libSDL_net-1.2.so.0 libSDL_mixer-1.2.so.0 (libc6,x86-64) => /usr/lib/libSDL_mixer-1.2.so.0 libSDL_mixer-1.2.so.0 (libc6) => /usr/lib32/libSDL_mixer-1.2.so.0 libSDL_image-1.2.so.0 (libc6,x86-64) => /usr/lib/libSDL_image-1.2.so.0 libSDL_image-1.2.so.0 (libc6) => /usr/lib32/libSDL_image-1.2.so.0 libSDL-1.2.so.0 (libc6,x86-64) => /usr/lib/libSDL-1.2.so.0 libSDL-1.2.so.0 (libc6) => /usr/lib32/libSDL-1.2.so.0 触发器设置的值似乎没有自动反转,但是您可以使用Interaction显式取消触发器设置的值,因此具有依赖性属性当前值恢复为以前的值,如下所示:

DependencyProperty.UnsetValue

回复旧帖子,但将其放置在此处,以便其他人(例如我)查找触发器的信息。

免责声明:实际上,我仅使用新的open source packaging of xaml behaviors在.NET Core 3.1上进行了测试。保留经典的i / ei名称空间以与原始问题保持一致。