Подтвердить что ты не робот

Триггер стиля 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.

4b9b3361

Ответ 1

В WinRT RelativeSourceMode поддерживает только Self и TemplatedParent, 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"));
            }
        }
    }
}