c# - 缺少 UWP 样式触发器

标签 c# xaml visual-studio-2015 win-universal-app uwp

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 Behaviors ,您需要使用 ElementName 作为解决方法。如果您在项目中使用 DataContext 或 ViewModel,则可以绑定(bind)到 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"));
            }
        }
    }
}

关于c# - 缺少 UWP 样式触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33648456/

相关文章:

c# - Linq IEnumerable<IGrouping<string, Class>> 回到 List<Class>

c# - 使用 NameValueCollection 将 QueryString 转换为 URL-Encode

wpf - 创建 MVVM WPF 应用程序时的正确方法

c++ - 使用 Visual Studio 将现有文件条目移动到项目过滤器文件夹

c++ - 错误 LNK2019 无法解析的外部符号 Tesseract OCR C++ 使用 VS 2015

C# 随机消失的用户控件

c# - 使用 Roslyn 有选择地删除预处理器指令

wpf - 如何在 WPF 菜单控件上设置前景色和背景色?

xaml - 在 XAML 中设置今天的日期

c# - Visual Studio 2015 Update 3 无法打开 .cs 文件