2009-08-25 2 views
3

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

EDIT Проблема заключается в том, что в моем ResorceDictionary у меня есть 2 типа, с й: Ключ установлен

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

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

ответ

8

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

Когда вы говорите «динамически», я предполагаю, что вы имеете в виду код, а не 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> 
Смежные вопросы