1
我有一个名为Handle
的基类,我从中推导出几个基类,如RectHandle
和EllipseHandle
。在这些子类中,我试图覆盖默认样式键指向Handle
,但不适用以Handle
为目标的样式。我仍然必须直接或通过'BasedOn'风格明确地定位RectHandle
或EllipseHandle
。我错过了什么?为什么DefaultStyleKey不会改变我的子类的默认样式?
下面是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}}" />
你的解决方法是正确的方式 – Spawn
我看到你删除了你原来的评论,指向我的解决方案。但是这并没有明确说明如何设置DefaultStyleKeyProperty的元数据。当然,如果情况并非如此,那么您的解决方案仍然有效,但如果您设置了该解决方案,则不需要“BasedOn”。 – MarqueIV