在WPF中,如何覆盖实例级别的模板设置的样式?

时间:2014-01-03 16:09:48

标签: wpf

所以我有一个滚动条的自定义模板。它工作得很好,但我想覆盖转角值。在模板上,它设置如下:

    <ControlTemplate x:Key="VerticalScroll" TargetType="{x:Type ScrollBar}">
        <Grid>
            <Border Grid.RowSpan="3" CornerRadius="3" BorderBrush="DarkBlue" BorderThickness="1" Opacity=".6"></Border>

我正在创建我的实例:

    <ScrollViewer Padding="0,0,0,0">
        <TextBlock  Height="23" HorizontalAlignment="Stretch" Margin="0" Name="textBlock1" Text="TextBlock" VerticalAlignment="Top" />
    </ScrollViewer>

如何将CornerRadius更改为6?

3 个答案:

答案 0 :(得分:0)

我认为没有任何简单的方法可以做到这一点,因为WPF中没有模板继承。您可能需要复制整个模板并针对此特定实例进行修改,或者在样式中设置模板

答案 1 :(得分:0)

使用附加的DependencyProperty。 Attached DependencyProperty允许您存储信息和DependencyObject。

因此,在下面的例子中,针对MainWindow创建一个Attached DependencyProperty。

    public static readonly DependencyProperty CornerRadiusProperty = DependencyProperty.RegisterAttached("CornerRadius", typeof(int), typeof(MainWindow));

    public static void SetCornerRadius(DependencyObject element, int value)
    {
        element.SetValue(CornerRadiusProperty, value);
    }

    public static int GetCornerRadius(DependencyObject element)
    {
        return (int) element.GetValue(CornerRadiusProperty);
    }

然后在Xaml中,在ScrollViewer上分配值

<ScrollViewer Padding="0,0,0,0" this:MainWindow.CornerRadius="20" ... >

并在模板中,使用TemplatedParent绑定引用Attached DependencyProperty。

    <ControlTemplate x:Key="ScrollViewerTemplate" TargetType="{x:Type ScrollViewer}">
        <Grid>
            <Border Grid.RowSpan="3" CornerRadius="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(this:MainWindow.CornerRadius)}" BorderBrush="DarkBlue" BorderThickness="1" Opacity=".6">

我希望这会有所帮助。

答案 2 :(得分:0)

如果您有兴趣从外部设置的唯一属性,则可以将值存储在Tag中,并使用标记执行TemplateBinding

<Border CornerRadius="{TemplateBinding Tag}"/>

并在实例中ScrollViewer:

<ScrollViewer Tag="6"/>

但是,如果您想从外部设置更多属性,子类ScrollViewer并创建自定义DP ,或者您也可以使用attached properties以防对子类化不感兴趣的ScrollViewer。