Добавление сеттера для цвета переднего плана для всех элементов в UserControl, используя XAML - PullRequest
2 голосов
/ 29 декабря 2010

My UserControl содержит несколько ярлыков.В XAML я хочу определить установщик, который позволяет клиентам устанавливать Foreground для всех этих сразу.


Исходный код: (упрощенно)

ПодPage.Resources:

<DataTemplate x:Key="customItemTemplate">
    <StackPanel Orientation="Horizontal">
        <MyControlLib:XYControl Unit="{Binding XYUnit}"/>
            <TextBlock Text="{Binding XYMultiplier}" Width="16"/>
    </StackPanel>
</DataTemplate>

На странице Содержание:

<ListBox x:Name="XYZList" ItemTemplate="{StaticResource customItemTemplate}">
    <!-- Set Foreground to "Red" for all items -->
    <!-- For XYControl this is the TextForeground property -->
    <!-- For TextBlock this is (naturally) the Foreground property -->
</ListBox>

(Прочитайте комментарии XAML о величии WPF, которого я хочу достичь)

Конечно, customItemTemplate используется более чем в одном месте на странице и имеет другой цвет.

Как просто это может быть в WPF!

Ответы [ 2 ]

2 голосов
/ 29 декабря 2010

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

public static readonly DependencyProperty LabelForegroundProperty = DependencyProperty.Register(
    "LabelForeground",
    typeof(Brush),
    typeof(MyUserControl),
    new UIPropertyMetadata(Brushes.Black));

public Brush LabelForeground
{
    get { return (Brush)GetValue(LabelForegroundProperty); }
    set { SetValue(LabelForegroundProperty, value); }
}

Затем вы можете создать стиль по умолчанию для метки внутри UserControl, который привязывается к этому значению:

<UserControl.Resources>
    <Style TargetType="{x:Type Label}">
        <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type MyUserControl}}, Path=LabelForeground}" />
    </Style>
</UserControl.Resources>

Затем любой экземпляр элемента управления может установить свое собственное значение, которое будет применяться к его собственным меткам:*

<MyUserControl LabelForeground="Red"/>
1 голос
/ 29 декабря 2010

Я верю, что этот пример поможет вам. Стиль определен в родительском узле, поэтому он вступает в силу для всех меток, а в коде за ним его заменяет новый стиль.

XAML:

 <StackPanel x:Name="root">
    <StackPanel.Resources>
        <Style  TargetType="Label">
            <Setter Property="Foreground" Value="Red"/>
        </Style>
    </StackPanel.Resources>
    <Label>AAA</Label>
    <Label>BBB</Label>
    <Button Click="Button_Click">Change Color</Button>
</StackPanel>

Код:

  private void Button_Click(object sender, RoutedEventArgs e)
    {
        var x = new Style();
        x.Setters.Add(new Setter { Property = TextBlock.ForegroundProperty, Value = new SolidColorBrush(Colors.Green) });

        root.Resources.Clear();
        root.Resources.Add(typeof(Label), x);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...