1

我正在继承一个 ItemsControl(我们称之为 EnhancedItemsControl),并且我想公开 ScrollViewerTemplate 依赖属性,这将允许用户有选择地为使用的 ScrollViewer 指定他自己的模板。我这样做是这样的:

public ControlTemplate ScrollViewerTemplate
{
   get { return (ControlTemplate)GetValue(ScrollViewerTemplateProperty); }
   set { SetValue(ScrollViewerTemplateProperty, value); }
}

public static readonly DependencyProperty ScrollViewerTemplateProperty =
   DependencyProperty.Register(
   "ScrollViewerTemplate", 
   typeof(ControlTemplate), 
   typeof(EnhancedItemsControl),
   new UIPropertyMetadata(new ScrollViewer().GetValue(ScrollViewer.TemplateProperty))); //This doesn't work for me

在我的 EnhancedItemsControl 的默认样式中,我将 ScrollViewer 包含在内,如下所示:

<ScrollViewer
   Template="{TemplateBinding ScrollViewerTemplate}"
   ...
>
    <ItemsPresenter
    ...
    />
</ScrollViewer>

这在用户指定 ScrollViewerTemplate 时有效,但是当他将其保留为默认值时,不会显示 ScrollViewer(可能是因为它的 Template 为空)。如何告诉 WPF仅在非空时使用模板,否则使用默认模板?(我突然想到,只有当模板不为空时,我才能使用触发器来设置模板,但我不喜欢为每个控件中的每个自定义属性都设置触发器的想法......)

样式也有类似的问题——如果我想让用户指定 ScrollViewer 样式,但用户没有指定,则 ScrollViewerStyle 的值为 null(等于<ScrollViewer Style="{x:Null}" />),这将阻止应用默认样式!

如何解决这个问题?谢谢!

4

2 回答 2

1

您可以使用带有 TemplatedParent 的 RelativeSource 的绑定,而不是使用 TemplateBinding。这样您就可以在 Binding 中使用转换器。现在为您的 Binding 声明一个 Converter(IValueConverter) 并在 ScrollViewerTemplate 属性为空时返回默认模板。

更多信息

于 2010-01-02T04:55:59.087 回答
1

除了一点点之外,您所做的一切都是正确的,您在其中指定的默认值UIPropertyMetadata实际上是 null,因为ScrollViewer默认情况下它在 new 中也是 null。

ScrollViewerTemplate定义一个属性,而不是定义一个ScrollViewerStyle属性:

public Style ScrollViewerStyle
{
    get { return (Style)GetValue(ScrollViewerTemplateProperty); }
    set { SetValue(ScrollViewerTemplateProperty, value); }
}

public static readonly DependencyProperty ScrollViewerTemplateProperty =
    DependencyProperty.Register(
        "ScrollViewerStyle", 
        typeof(Style), 
        typeof(EnhancedItemsControl), 
        new UIPropertyMetadata(null));

在控件的默认样式中,指定样式的默认值,如下所示:

<Setter Property="ScrollViewerStyle" Value="{StaticResource {x:Type ScrollViewer}}"/>

这实际上将默认为当前主题定义的 ScrollViewer 样式。

于 2010-01-02T13:39:32.547 回答