WPF Style для всего управления одним UserControl - PullRequest
3 голосов
/ 25 августа 2009

Есть ли способ применить стиль ко всем элементам управления одного и того же типа в одном пользовательском элементе управления динамически, без применения ко всем элементам управления моего приложения и без перехода к элементу управления и установки стиля вручную?

EDIT Проблема в том, что в моем ResorceDictionary у меня есть 2 стиля, с набором x: Key

<Style x:Key="ScrollBar_White" TargetType="{x:Type ScrollBar}">
<Style x:Key="ScrollBar_Black" TargetType="{x:Type ScrollBar}">

И я хочу знать, есть ли способ в XAML динамически применять именованный стиль без использования следующего кода на всех полосах прокрутки моего UserControl.

<ScrollBar Style="ScrollBar_White">

EDIT

Извините, я новичок в WPF, поэтому я скучаю, чтобы сообщить вам кое-что важное (что я обнаружил после применения вашего последнего решения). Последнее решение действительно работает, если стили - это StaticResources, но они являются DynamicResources и BasedOn плохо работают с DynamicResources.

Есть идеи, как это сделать с помощью DynamicResource?

Большое спасибо, и извините, я упускаю важные моменты в моих вопросах.

1 Ответ

7 голосов
/ 25 августа 2009

Да, добавьте его в словарь ресурсов рассматриваемого элемента управления.

Когда вы говорите «динамически», я предполагаю, что вы имеете в виду в коде, а не в XAML. Вы можете использовать метод ResourceDictionary.Add в своем пользовательском элементе управления из кода.

Вот пример кода:

public MyUserControl()
{
    InitialiseComponent();

    var style = new Style(typeof(TextBlock));
    var redBrush = new SolidColorBrush(Colors.Red);
    style.Setters.Add(new Setter(TextBlock.ForegroundProperty, redBrush));
    Resources.Add(typeof(TextBlock), style);
}

Это эквивалент (в XAML):

<UserControl.Resources>
  <Style TargetType="TextBlock">
    <Setter Property="Foreground" Value="Red" />
  </Style>
</UserControl.Resources>

Поскольку x:Key не применяется к стилю, он воспринимается всеми экземплярами целевого типа. Внутренне сам тип используется как ключ (я полагаю).

EDIT

Учитывая обновление вашего вопроса, кажется, что вы хотите это:

<!-- this is the parent, within which 'ScrollBar_White' will be applied
     to all instances of 'ScrollBar' -->
<StackPanel>
  <StackPanel.Resources>
    <Style TargetType="ScrollBar" BasedOn="{StaticResource ScrollBar_White}" />
  </StackPanel.Resources>
  <!-- scrollbars in here will be given the 'ScrollBar_White' style -->
<StackPanel>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...