2015-11-11 12 views
13

Sembra che UWP XAML non supporti i trigger negli stili. Qual è la soluzione alternativa più comune per eseguire trigger come il seguente?Trigger stile UWP mancante

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

Al momento vedo le seguenti opzioni per eseguire trigger in UWP:

Utilizzare animazioni o VisualStateTriggers. Entrambi sembrano sbagliati se li uso non per regolare i controlli sullo schermo.


Penso di aver trovato il modo corretto di implementare Trigger in generale per i controlli. Vedere il codice qui sotto come dimostrazione:

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> 

Sarebbe fantastico se v'è una soluzione senza ElementName. Lo avrei fatto in WPF con AncestorType, ma manca anche in UWP. Ad ogni modo, sembra che non sia possibile usare lo Core:DataTriggerBehavior in stili.

+0

In applicazioni UWP, è necessario utilizzare [stati visivi] (https://msdn.microsoft.com/library/windows/apps /windows.ui.xaml.visualstatemanager.aspx). – Herdo

+0

Dai un'occhiata alla creazione di uno StateTrigger personalizzato (ereditato da StateTriggerBase) e utilizzalo all'interno di uno stato visivo –

risposta

5

In WinRT, RelativeSourceMode supportano solo Auto e TemplatedParent modalità, FindAncestor non è disponibile. Pertanto, quando si utilizza XAML Behaviors, è necessario utilizzare ElementName come soluzione alternativa. E se stai usando DataContext o ViewModel nel tuo progetto, puoi associare DataContext o ViewModel per evitare l'uso di ElementName. Per esempio:

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

E il ViewModel usato sopra:

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