gpt4 book ai didi

wpf - 混合触发器与 WPF 触发器

转载 作者:行者123 更新时间:2023-12-04 21:19:34 25 4
gpt4 key购买 nike

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

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

我尝试编写 DataTrigger类似地使用 Blend 方式:我将 ChangePropertyAction 应用于我的控件,并让它触发 Interactivity DataTrigger使用绑定(bind)到我的 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 值翻转为 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。

最佳答案

如其他答案所述,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>
免责声明:我实际上只在 .NET Core 3.1 上使用新的 open source packaging of xaml behaviors 进行了测试。 .保留经典的 i/ei 命名空间以与原始问题保持一致。

关于wpf - 混合触发器与 WPF 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15258199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com