所以我上课了;我们以ScrollViewer
类为例。它有一个名为Content
的依赖项属性,它接受System.Object
类型的任何内容,非常棒!
假设我从ScrollViewer
派生了一个类,让我们称之为ZoomScrollViewer
,它会使用键盘按下鼠标来添加一些基本的缩放和平移。它还添加了自己的依赖属性AutoscaleContent
。
现在,我希望能够将ZoomScrollViewer
放入UI窗口,但我仅希望它接受Canvas作为内容。当然,我要创建一个ZoomScrollViewer<T>
类。
但是,如何更改Content属性以便只接受<T>
类型的元素?我可以覆盖依赖属性吗?我有点困惑并尝试过:
public new T Content
{
get { return (T)base.Content; }
set { base.Content = value; }
}
但是当然这使它不再是依赖属性,所以当我设置绑定时,所有的XAML代码都会失败。
编辑:还应该注意我已经看过使用:
ZoomScrollViewer.ContentProperty.OverrideMetadata(typeof(ZoomScrollControl2<T>), new PropertyMetadata(...?));
看看我是否可以使用它做任何事情,但似乎你只能覆盖默认值,除非我遗漏了什么?
更新:我现在尝试使用以下内容:
public class ZoomScrollControl2<T> : ZoomScrollViewer where T : FrameworkElement
{
static ZoomScrollControl2()
{
ContentProperty.OverrideMetadata(typeof(ZoomScrollControl2<T>), new FrameworkPropertyMetadata(typeof(ZoomScrollControl2<T>)));
}
}
public class CanvasZoomControl : ZoomScrollControl2<Canvas>
{
}
我认为这样可行,但它似乎仍然接受任何类型的内容。
更新:简而言之,我不确定我想做的事情是否可行,所以我将讨论标记为答案,即使这不是答案本身。
答案 0 :(得分:2)
我建议按照this MSDN文章的建议尝试这种方法。
它应该覆盖referal类型,因此您可以使用派生类型引用它。
Dependency Property
在.NET Framework
中对于派生类型没有明确的可见性,因为在类型树中搜索权限属性在性能方面有成本,并且考虑到我们使用DP
UI绑定,可能会导致非理想的性能问题。