2015-11-11 6 views
13

Es scheint, dass UWP XAML Trigger in Stilen nicht unterstützt. Was ist die übliche Problemumgehung, um Trigger wie die folgenden zu erreichen?UWP-Stil-Trigger fehlt

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

Im Moment habe ich die folgenden Optionen sehen Trigger in UWP zu erreichen:

Verwenden Animationen oder VisualStateTriggers. Beide scheinen falsch zu liegen, wenn ich sie benutze, um die Bedienelemente nicht auf den Bildschirm einzustellen.


Ich glaube, ich den richtigen Weg gefunden Trigger für Kontrollen in der Regel zu implementieren. Siehe unten stehenden Code als Demonstration:

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> 

Es wäre genial, wenn es eine Lösung ohne Elementnamen ist. Ich hätte dies in WPF mit AncestorType getan, aber das fehlt auch in UWP. Wie auch immer, es scheint, dass Sie die Core:DataTriggerBehavior in Stilen nicht verwenden können.

+0

In UWP-Anwendungen, müssen Sie [visuelle Zustände] (https://msdn.microsoft.com/library/windows/apps /windows.ui.xaml.visualstatemanager.aspx). – Herdo

+0

Sehen Sie sich an, wie Sie einen benutzerdefinierten StateTrigger erstellen (von StateTriggerBase erben) und diesen dann in einem visuellen Status verwenden –

Antwort

5

In WinRT, RelativeSourceMode unterstützen nur Selbst und TemplatedParent Modus FindAncestor ist nicht verfügbar. Wenn Sie also XAML Behaviors verwenden, müssen Sie ElementName als Workaround verwenden. Und wenn Sie DataContext oder ViewModel in Ihrem Projekt verwenden, können Sie eine Bindung an den DataContext oder ViewModel herstellen, um die Verwendung von ElementName zu vermeiden. Zum Beispiel:

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

Und das Ansichtsmodell oben verwendet:

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