基于父级从模板更改组件的属性

时间:2014-11-21 18:18:55

标签: c# wpf xaml templates

我想对两个控件使用相同的样式,只需更改其层次结构深处的两种背景颜色。

我有一个TextBox,一个ScrollViewer的样式,一个样式和一个模板,其ScrollBar的边框为Background,其样式为{ {1}}其边框为Thumb

如何仅使用TextBox更改两个背景(以编程方式与否)?

         .........                      ..........                                      ..........              

Background

有没有办法改变两个背景(使用这个颜色和另一个控件上的另一个相同的滚动查看器可能使用另一个颜色)而不用重写整个代码?

例如要有它的风格并写:

<!-- ScrollBar Style -->
    <Style x:Key="{x:Type ScrollBar}" TargetType="ScrollBar">
        ....
        <Style.Triggers>
            <Trigger Property="Orientation" Value="Horizontal">
                ....
                <Setter Property="Template" Value="{StaticResource HorizontalScrollBarTemplate}"/>
                ....
            </Trigger>
        </Style.Triggers>
    </Style>

<!-- Horizontal Scrollbar Template -->
    <ControlTemplate x:Key="HorizontalScrollBarTemplate" TargetType="{x:Type ScrollBar}">
        <Grid Background="{StaticResource ScrollBackroundBrush}">
            <Track Name="PART_Track">
                <Track.Thumb>
                    <Thumb Style="{StaticResource ScrollBarThumb}"/>
                </Track.Thumb>
            </Track>
        </Grid>
    </ControlTemplate>

<!-- Thumb Style -->
    <Style x:Key="ScrollBarThumb" TargetType="{x:Type Thumb}">
....
        <Setter Property="Template">
            ....
                    <Border
                        ....
                        Background="{StaticResource ScrollThumbBrush}"/>
           ....
        </Setter>
    </Style>

1 个答案:

答案 0 :(得分:1)

我做了相应的例子。如果您只设置一种颜色,则可以使用 Tag 属性,因为它是 DependencyProperty 。然后创建两个附加属性并按如下方式访问它们:

 <Button local:Color.CustomBackground="CadetBlue">
            <Button.Template>
                <ControlTemplate TargetType="Button">
                    <ContentPresenter>
                        <ContentPresenter.ContentTemplate>
                            <ItemContainerTemplate>
                                <Border Width="50" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}"
                                        Background="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=(local:Color.CustomBackground)}">

                                </Border>
                            </ItemContainerTemplate>
                        </ContentPresenter.ContentTemplate>
                    </ContentPresenter>
                </ControlTemplate>
            </Button.Template>
        </Button>

C#

 public class Color : DependencyObject
    {
        private static readonly DependencyProperty CustomBackgroundProperty =
            DependencyProperty.RegisterAttached("CustomBackground", typeof(SolidColorBrush), typeof(Color),
                new PropertyMetadata(null));

        public static void SetCustomBackground(DependencyObject obj, SolidColorBrush color)
        {
            obj.SetValue(CustomBackgroundProperty, color);
        }

        public static SolidColorBrush GetCustomBackground(DependencyObject obj)
        {
            return (SolidColorBrush)obj.GetValue(CustomBackgroundProperty);
        }
    }