2011-09-09 16 views
5

Wątpię, czy to możliwe, ale chciałem tylko potwierdzić.Stosowanie stylów WPF, takich jak CSS i Html

Piszę prostą aplikację WPF i chcę, aby mój styl został zdefiniowany zewnętrznie, więc zasadniczo można załadować styl jako zewnętrzny zasób. Trochę jak oddziela się CSS i HTML ...

Jedną z rzeczy, która mnie trapi jest to, że z HTML & CSS jest bardziej zewnętrznym podejściem, CSS celuje w elementy i jest stosowany do pasujących elementów . Jednak z WPF wydaje się, że jest na odwrót, musisz powiedzieć elementowi, jakie style powinien on zastosować, jednak nie wydaje się to zbytnio niezauważalne. Po prostu chcę wiedzieć, czy istnieje sposób na zastosowanie stylów, więc style są ukierunkowane na elementy.

Przykładem może być coś takiego:

<Style TargetType="{x:Type TextBox}" TargetElement="{x:Name SomeTextboxElement}"> 
    <Setter Property="Width" Value="Auto"/> 
</Style> 

normalnie trzeba podać klucz ze stylem, a następnie uzyskać element (SomeTextboxElement) mapować do klucza w stylu.

Po prostu wydaje się nieco głupio, gdy trzeba jawnie nadać każdemu elementowi styl wiązania, powinien on być bardziej hierarchiczny i filtrowany (co może być możliwe, ja po prostu nie wiem jak) i nie być mapowaniem jeden do jednego. Zajęłoby wieki styl całą aplikację ...

nadzieję, że sens ...

Odpowiedz

2

Co mówisz szukasz jest interesująca, ale nie działa z myślenia WPF, w którym zastosuj styl do typu wizualnego lub wizualnego (co oznacza: możesz zastosować styl do określonego typu lub zdefiniować styl jako zasób z nazwanym kluczem i jawnie użyć tego klucza). W twoim przypadku, myślę, tworząc styl jak poniżej należy zrobić:

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="Width" Value="Auto"/> 
</Style> 

To będzie zastosować styl do wszystkich pól tekstowych, po prostu pominąć Atrybut targetElement.

Wiem, że to nie jest to samo, ale jeśli chcesz mieć ten sam podstawowy styl sterowania z kilkoma zmianami w zależności od użycia, spróbuj użyć wyzwalacza, który wprowadza drobne zmiany. Zwykle używam atrybutu "Tag" w moich kontrolkach, aby podać trochę dodatkowych informacji do mojej definicji stylu. Przykładowy podstawowy styl przycisku, ale 3 przyciski:

 <Style.Triggers> 
      <Trigger Property="Tag" Value="delete"> 
       <Setter Property="Background" Value="Red"></Setter> 
      </Trigger> 
      <Trigger Property="Tag" Value="confirm"> 
       <Setter Property="Background" Value="Green"></Setter> 
      </Trigger> 
     </Style.Triggers> 

Teraz trochę hipotezy. Co chcesz byłoby bardzo łatwe do wdrożenia, jeśli zostały spełnione dwa warunki:

  • Wszystko WPF wizualne mają DependencyProperty nazwie „ParentVisual”, powracając wizualną że natychmiast zawiera wizualne w pytaniu.
  • Wszystko WPF wizualne mają DepencyProperty, powiedzieć „VisualType”

Biorąc pod uwagę, że i łącząc to z wyzwalaczy/multitriggers będzie wtedy pozwalają tworzyć wyzwalacze dla ParentVisual.VisualType.

Zdefiniujmy niektóre hipotetyczne CSS dla WPF, aby zastosować styl do dowolnego pola tekstowego zawartego w Obramowaniu z "podnaikiem" zawartym w siatce.

Grid Border#subnavi TextBox 
{ 
    backgroundColor:#FF0000; 
} 

Przetłumaczone na WPF, to byłoby to Multitrigger dla TextBox z trzech warunków:

<MultiTrigger> 
    <Condition Property="ParentVisual.VisualType" Value="Border"></Condition> 
    <Condition Property="ParentVisual.Name" Value="subnavi"></Condition> 
    <Condition Property="ParentVisual.ParentVisual.VisualType" Value="Grid"></Condition> 
    <Setter Property="Background" Value="Red"/> 
    </MultiTrigger> 

Ale niestety, nie ma takiego DependencyProperties, dzięki czemu będziemy w stanie wykorzystać tylko mechanizm Wspomniałem wyżej, jeśli tworzysz wrappery dla każdego z elementów sterujących wpf.

Powrót do tego, co nazwałem zestawem umysłów WPF: elementy WPF są stylizowane przez silnik WPF idący po wizualnym drzewie w górę, a nie w dół, zaczynając od danej kontroli. CSS działa na odwrót, jak sądzę.

EDYCJA: Myślę, że może być bardziej wskazane, aby użyć klasy DependencyObject niż przy użyciu Visual w tym, co napisałem powyżej.

+0

Jego wstyd, jak WPF wydawało się pomost pomiędzy web developer i twórca aplikacji , nie jest to koniec świata, który musi nadać każdemu obiektowi wyraźną nazwę stylu, ponieważ i tak można go przesłonić, ale wydaje się, że utrzymanie i zmiana w przyszłości wymaga nieco więcej pracy. – somemvcperson

0

Szukasz niejawnych stylów. Nie są one tak szczegółowe jak selektory css, ale można zdefiniować styl dla każdego typu elementu. Na przykład, następujący przykład mówi: „Chcę wszystkie moje przyciski mieć szerokość 80”

<Style TargetType="{x:Type Button}"> 
    <Setter Property="Width" Value="80"/> 
</Style> 

definicje te mogą być wykonane w różnych zakresach: application, strona, kontroli, czy każdy element ramy tylko przez dodając go jako zasób. Środowisko wykonawcze podejmie oddolne podejście podczas wyszukiwania niejawnego stylu, a użyje pierwszego, które znajdzie.

Aby uzyskać więcej informacji, patrz this article.

Powiązane problemy