web-dev-qa-db-ja.com

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なしのソリューションがあれば、すばらしいでしょう。 AncestorTypeを使用してWPFでこれを行ったはずですが、UWPでもそれがありません。とにかく、Core:DataTriggerBehaviorスタイルで。

20
Briefkasten

WinRTでは、 RelativeSourceModeSelfおよびTemplatedParentモードのみをサポートし、FindAncestor 利用できません。したがって、 XAML Behaviors を使用する場合、回避策としてElementNameを使用する必要があります。また、プロジェクトでDataContextまたはViewModelを使用している場合は、ElementNameを使用しないようにDataContextまたはViewModelにバインドできます。例えば:

<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"));
            }
        }
    }
}
6
Jay Zuo