【发布时间】:2015-10-05 19:06:10
【问题描述】:
我有一个名为Handle 的基类,从中派生出几个基类,例如RectHandle 和EllipseHandle。在这些子类中,我尝试覆盖默认样式键以指向Handle,但未应用以Handle 为目标的样式。我仍然必须直接或通过“BasedOn”样式明确定位RectHandle 或EllipseHandle。我错过了什么?
这是 DefaultStyleKeyProperty 的 MSDN 摘录:
控件通常会将此属性的默认值覆盖为自己的类型,但在某些情况下,也可以使用主题字典中存在样式的基本类型。
这是我的代码
public abstract class Handle : Shape
{
static Handle()
{
WidthProperty.OverrideMetadata(
typeof(Handle),
new FrameworkPropertyMetadata(10.0));
HeightProperty.OverrideMetadata(
typeof(Handle),
new FrameworkPropertyMetadata(10.0));
FillProperty.OverrideMetadata(
typeof(Handle),
new FrameworkPropertyMetadata(Brushes.Yellow));
StrokeProperty.OverrideMetadata(
typeof(Handle),
new FrameworkPropertyMetadata(Brushes.Gray));
StrokeThicknessProperty.OverrideMetadata(
typeof(Handle),
new FrameworkPropertyMetadata(2.0));
}
}
public class RectHandle : Handle
{
static RectHandle()
{
DefaultStyleKeyProperty.OverrideMetadata(
typeof(RectHandle),
new FrameworkPropertyMetadata(typeof(Handle)));
}
protected override Geometry DefiningGeometry
{
get
{
var origin = new Point(-RenderSize.Width / 2, -RenderSize.Height / 2);
var rect = new Rect(origin, RenderSize);
return new RectangleGeometry(rect);
}
}
}
public class EllipseHandle : Handle
{
static RectHandle()
{
DefaultStyleKeyProperty.OverrideMetadata(
typeof(EllipseHandle),
new FrameworkPropertyMetadata(typeof(Handle)));
}
protected override Geometry DefiningGeometry
{
get
{
var origin = new Point(-RenderSize.Width / 2, -RenderSize.Height / 2);
var rect = new Rect(origin, RenderSize);
return new EllipseGeometry(rect);
}
}
}
还有风格……
<Style TargetType="{x:Type annotations:Handle}">
<Setter Property="Stroke" Value="Red" />
</Style>
同样,这不起作用。
我的解决方法是在第一个样式的基础上创建另外两个样式,但我认为这就是 DefaultStyleKey 属性的全部意义所在。
<Style TargetType="{x:Type annotations:Handle}">
<Setter Property="Stroke" Value="Red" />
</Style>
<Style TargetType="{x:Type annotations:RectHandle}"
BasedOn="{StaticResource {x:Type annotations:Handle}}" />
<Style TargetType="{x:Type annotations:EllipseHandle}"
BasedOn="{StaticResource {x:Type annotations:Handle}}" />
【问题讨论】:
-
你的解决方法是正确的
-
我看到您删除了指向我的解决方案的原始评论。但这并没有解释明确设置 DefaultStyleKeyProperty 的元数据。如果不是这种情况,您的解决方案当然有效,但如果您设置它,则不需要“BasedOn”。