繁体   English   中英

UWP样式触发器丢失

[英]UWP style trigger missing

似乎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

在WinRT中, RelativeSourceMode仅支持SelfTemplatedParent模式, FindAncestor不可用。 因此,当您使用XAML行为时 ,您需要使用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"));
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM