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