2009-06-22 17 views
39

Właśnie szarpałem trochę w WPF i chciałem, aby wszystkie elementy w moim oknie miały ten sam margines. Okazało się, że wszystkie parametry, które są zdolne do posiadania marginesu pochodzą z FrameworkElement więc próbowałem następujące:Ustawianie właściwości TargetType stylu na klasę podstawową

<Window.Resources> 
<Style TargetType="{x:Type FrameworkElement}"> 
    <Setter Property="Margin" Value="10" /> 
</Style> 
</Window.Resources> 

I to nie działa. Mogę zastosować to do wszystkich Przycisków, ale nie do wszystkich Elementów, które pochodzą z Przycisku. Czy czegoś brakuje, czy jest to po prostu niemożliwe?

Czy jestem jedynym uczuciem, jak używanie CSS do WPF byłoby dobrym pomysłem?

+2

Wiem, że to stary post, ale nie jesteś jedyny. CSS nie jest doskonały, ale dobrym pomysłem byłoby użycie czegoś, co nie jest _worse_ niż CSS. –

Odpowiedz

54

Niestety, nie można stosować stylów do podstawowego typu FrameworkElement; podczas gdy WPF pozwoli ci napisać styl, nie będzie go stosować do kontrolek, które z niego wynikają. Wydaje się, że dotyczy to również podtypów FrameworkElement, np. ButtonBase, supertype Button/ToggleButton/RepeatButton.

Nadal możesz używać dziedziczenia, ale będziesz musiał użyć jawnej składni BasedOn, aby zastosować go do typów kontrolnych, do których ma on zastosowanie.

<Window.Resources> 
    <Style TargetType="{x:Type FrameworkElement}"> 
     <Setter Property="Margin" Value="10" /> 
    </Style> 

    <Style TargetType="{x:Type Label}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 
    <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 
    <Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 

</Window.Resources> 

+1

Dzięki. Myślałem o tym również, ale czuję się strasznie wolno, jeśli chciałbym, aby jeden styl był stosowany do WSZYSTKICH elementów znajdujących się w Oknie. – Tigraine

+4

Nie działa tutaj. Otrzymuję wyjątek XamlParseException, w którym parametr TargetType nie pasuje do innego typu. Próbowałem tego na mojej klasie pochodzącej od Buta i normalnym przycisku. – ygoe

+1

Czy istnieje lepszy sposób zastosowania stylu globalnego do WSZYSTKICH elementów sterujących w aplikacji? – Shimmy

7

Kwestia jest taka, że ​​przy poszukiwaniu stylu WPF nie przeszukiwać wszystkich klas, z których jeden czerpie prąd. Możesz jednak nadać stylowi klucz i zastosować go do wszystkich elementów, dla których chcesz mieć wspólną właściwość. Jeśli właściwość jest określona w stylu, który nie może być zastosowany do stylizowanego elementu, jest on ignorowany.

Powiązane problemy