UWP风格触发器丢失

23

看起来 UWP XAML 不支持在样式中使用触发器。有什么通用的解决方法可以实现像下面这样的触发器吗?

<Style TargetType="Button">
    <Style.Triggers>
        <Trigger Property="Visibility" Value="Collapsed">
            <Setter Property="Text" Value="" />
        </Trigger>
    </Style.Triggers>
</Style>

目前我看到在UWP中实现触发器的以下选项:

使用动画或VisualStateTriggers。如果不是将它们用于调整控件以适应屏幕,则两者似乎都不正确。


我认为我找到了一般情况下为控件实现触发器的正确方法。 请参见下面的代码示例:

xmlns:Interactivity="using:Microsoft.Xaml.Interactivity" 
xmlns:Core="using:Microsoft.Xaml.Interactions.Core"

<Border x:Name="BackgroundElement" Tag="Text">
    <Interactivity:Interaction.Behaviors>
        <Core:DataTriggerBehavior Binding="{Binding Tag, ElementName=BackgroundElement}" Value="Text">
            <Core:ChangePropertyAction PropertyName="BorderBrush" Value="AliceBlue" />
        </Core:DataTriggerBehavior>
    </Interactivity:Interaction.Behaviors>
</Border>

如果有一种不需要ElementName的解决方案,那将是很棒的。 在WPF中,我会使用AncestorType来完成此操作,但在UWP中也缺少该功能。 无论如何,似乎无法在样式中使用 Core: DataTriggerBehavior


在 UWP 应用程序中,您必须使用 可视状态 - Herdo
请尝试创建一个自定义的StateTrigger(继承自StateTriggerBase),然后在可视状态中使用它。 - Dan Harris
1个回答

8
在WinRT中,RelativeSourceMode只支持SelfTemplatedParent模式,不支持FindAncestor。因此,在使用XAML Behaviors时,需要使用ElementName作为解决方法。如果您的项目中使用了DataContext或ViewModel,则可以绑定到DataContext或ViewModel,以避免使用ElementName。例如:
<Page ...>
    <Page.Resources>
        <local:MyViewModel x:Key="ViewModel" />
    </Page.Resources>
    ...
    <Border x:Name="BackgroundElement" DataContext="{Binding Source={StaticResource ViewModel}}">
        <Interactivity:Interaction.Behaviors>
            <Core:DataTriggerBehavior Binding="{Binding Tag}" Value="Text">
                <Core:ChangePropertyAction PropertyName="Background" Value="Red" />
            </Core:DataTriggerBehavior>
        </Interactivity:Interaction.Behaviors>
    </Border>
    ...
</Page>

上面使用的ViewModel:

public class MyViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string _tag;

    public string Tag
    {
        get
        {
            return _tag;
        }

        set
        {
            _tag = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("Tag"));
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接