2009-10-19 29 views
7

Nie daj się złapać w moim przykładzie, po prostu wytrzymaj ze mną ze względu na pytanie:W WPF, w jaki sposób mogę zapobiec nadpisaniu mojego stylu?

W mojej aplikacji WPF, jeśli chciałem, aby wszystkie pola tekstowe miały "zielone" tło, łatwo byłoby ustawić to samo w moim Application.Resources.

<Style TargetType="TextBox"> 
<Setter Property="Background" Value="Green" /> 
</Style> 

Działa doskonale ... (dziękuję WPF). Jednak gdybym miał gdzieś w mojej aplikacji TextBoxa, to chciałbym, aby dołączyło nieco więcej stylistyki do ... I LOSE moje zielone tło.

Przykład:

<TextBox> 
<TextBox.Style> 
    <Style> 
    <Style.Triggers> 
    <Trigger Property="TextBox.IsMouseOver" Value="True"> 
    <Setter Property="TextBox.Foreground" Value="Red" /> 
    </Trigger> 
    </Style.Triggers> 
    </Style> 
</TextBox.Style> 
</TextBox> 

To TextBox będzie poprawnie mieć czerwoną Foreground gdy mysz jest skończona, ale zielonym tle jest kompletnie zagubiony.

Pytanie brzmi: jak mogę powiedzieć WPF NOT, aby całkowicie zniszczyć wszystkie stylizacje, które nadejdą z góry tylko dlatego, że mam prostą, nieuczestniczącą w konflikcie, oh tak mały styl dodany gdzieś do kontrolki?

Odpowiedz

11

Możesz dziedziczyć już nadpisane style za pomocą "BasedOn" w deklaracji stylu.

W deklaracji dla Twojego stylu drugiego, spróbuj tego:

<TextBox> 
<TextBox.Style> 
    <Style BasedOn="{StaticResource {x:Type TextBox}}"> 
    <Style.Triggers> 
    <Trigger Property="TextBox.IsMouseOver" Value="True"> 
    <Setter Property="TextBox.Foreground" Value="Red" /> 
    </Trigger> 
    </Style.Triggers> 
    </Style> 
</TextBox.Style> 
</TextBox> 

Można też oprzeć styl na nazwanego stylu

<Style x:Key=MyNamedStyle> 
</Style> 

<Style BasedOn="{StaticResource MyNamedStyle}" > 
</Style> 
+0

To prawda, ale to w zasadzie jak mówią „trzeba ponownie dodaj style do wszystkiego, co chcesz zastąpić ". :(- Dobra odpowiedź, ale nienawidzę tego rozwiązania: –

+0

Myślę o tym bardziej jako o stylu kaskadowym. Mogą istnieć miejsca, w których NIE chcesz dziedziczyć innych nadpisań stylu, lub gdy masz różne zestawy stylów dla ten sam rodzaj kontroli w różnych scenariuszach.W ten sposób daje większą kontrolę, więc nie przeszkadza mi to tak bardzo. –

+1

@Tymothy, atrybut BasedOn oznacza rozszerzenie stylu z określonego typu, nawet w OOPS, gdy dziedziczysz klasę, technicznie rzecz biorąc poziom kompilacji ponownie dodajesz wszystkie funkcje klasy bazowej do nowej klasy Dziedziczenie oznacza zatrzymywanie/kopiowanie wszystkiego i przesłonięcie jakiejś części –

Powiązane problemy