2015-11-11 15 views
13

Wygląda na to, że UWP XAML nie obsługuje wyzwalaczy w stylach. Jakie jest typowe obejście, aby wykonać wyzwalacze, takie jak poniższe?Brak wyzwalacza UWP

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

W tej chwili widzę następujące opcje do osiągnięcia wyzwalaczy w UWP:

Stosować Animations lub VisualStateTriggers. Oba wydają się błędne, jeśli użyję ich, aby nie dostosowywać kontroli do ekranu.


Myślę, że znalazłem prawidłowy sposób realizacji wyzwalaczy w ogóle dla kontroli. Zobacz poniższy kod jako demonstracji:

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> 

byłoby niesamowite, jeśli istnieje rozwiązanie bez ElementName. Zrobiłbym to w WPF z AncestorType, ale tego też brakuje w UWP. W każdym razie wydaje się, że nie można używać stylów w stylu Core:DataTriggerBehavior.

+0

W UWP aplikacji, trzeba użyć [stany wizualne] (https://msdn.microsoft.com/library/windows/apps /windows.ui.xaml.visualstatemanager.aspx). – Herdo

+0

Zobacz, jak utworzyć niestandardową funkcję StateTrigger (dziedziczą z StateTriggerBase), a następnie użyj jej wewnątrz stanu wizualnego –

Odpowiedz

5

W WinRT, RelativeSourceMode obsługują tylko Jaźni i TemplatedParent tryb, FindAncestor nie jest dostępna. Dlatego przy korzystaniu z XAML Behaviors jako obejścia należy użyć ElementName. A jeśli używasz DataContext lub ViewModel w projekcie, możesz powiązać dane z DataContext lub ViewModel, aby uniknąć używania ElementName. Na przykład:

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

a ViewModel stosowane powyżej:

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