2014-11-05 9 views
9

Kiedy należy wybrać Style.Triggers i kiedy należy wybrać ControlTemplate.Triggers? Czy są jakieś korzyści z używania jednego za drugim?Style.Triggers vs ControlTemplate.Triggers

Say mam te style, które osiągnąć ten sam rezultat:

<Style TargetType="{x:Type Button}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <ControlTemplate.Triggers> 
        ... 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style TargetType="{x:Type Button}"> 
    <Setter Property="Template"> 
     ... 
    </Setter> 
    <Style.Triggers> 
     ... 
    </Style.Triggers> 
</Style> 

Odpowiedz

10

Aktualizacja z Background does not change of button C# WPF przycisk w Windows 8 robi użyć ControlTemplate.Trigger dla IsMouseOver więc istnieją przypadki, gdzie ControlTemplate może być konieczne całkowicie nadpisane, aby uzyskać pożądaną funkcjonalność. Tak będzie w przypadku, gdy trzeba użyć wyzwalaczy ControlTemplate ponad wyzwalaczy stylu.

Nie zawsze trzeba zastępować domyślną ControlTemplate. Załóżmy, że masz kontrolę i chcesz, aby wszystkie elementy MyTextControl miały niebieskie Foreground, gdy IsMouseOver jest prawdziwe i pozostawiają wszystko inne jako domyślne. Można użyć coś takiego:

<Style TargetType="{x:Type MyTextControl}"> 
    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Foreground" Value="Blue"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Jeśli chcesz użyć ControlTemplate.Triggers trzeba by skopiować domyślnego MyTextControlTemplate lub inny mógłby skończyć się bez wideo. Poza tym myślę, że jedyną różnicą jest to, że Style.Triggers ma niższy priorytet niż ControlTemplate.Triggers (Precedence documantation). Ale będzie to miało znaczenie tylko wtedy, gdy użyjesz obu typów wyzwalaczy.

+0

Dla mnie to nie zastąpi domyślnego stylu szablonu. –

+0

@CoolBlue Prawo, kod tutaj pozostawi domyślny szablon nietknięty. Jeśli użyjesz kodu z pytania, które zastąpisz domyślnie. – ShyKnee

+0

Tak, chodzi mi o to, że ze względu na pierwszeństwo, wraz ze zmianami od Windows 8, powyższy kod przestał działać i to dlatego, że szablon nie został nadpisany przez styl. Najlepszym rozwiązaniem w dzisiejszych czasach jest kliknięcie prawym przyciskiem myszy kontrolki i skorzystanie z opcji edycji kopii domyślnego stylu. VS2013 zapewnia to od razu po wyjęciu z pudełka. –