使用XAML为UserControl中的所有元素添加前景色的setter

时间:2010-12-29 13:00:57

标签: wpf xaml user-controls

我的UserControl包含许多标签。在XAML中,我想定义一个setter,允许客户端一次为所有这些设置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>

(阅读我希望实现的WPF伟大的XAML评论)

当然,customItemTemplate在页面的多个位置使用,颜色不同。

WPF有多简单!

2 个答案:

答案 0 :(得分:2)

如果您希望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 :(得分:1)

我相信这个例子会对你有所帮助。 一个样式在父节点中定义,因此它对所有标签生效,并且在它背后的代码中被新样式取代。

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);
    }