为什么 DefaultStyleKey 不更改我的子类的默认样式?
Why doesn't DefaultStyleKey change the default style for my subclasses?
我有一个名为 Handle
的基 class,我从中派生出多个基 class,例如 RectHandle
和 EllipseHandle
。在那些 subclasses 中,我试图覆盖默认样式键以指向 Handle
,但未应用样式定位 Handle
。我仍然必须直接或通过 'BasedOn' 样式明确定位 RectHandle
或 EllipseHandle
。我错过了什么?
这是 DefaultStyleKeyProperty 的 MSDN 摘录:
A control typically overrides the default value of this property to be its own type, but in some cases could also use a base type for which a style in the theme dictionaries exists.
这是我的代码
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}}" />
我明白了。 DefaultStyleKey
属性 仅指在主题或主题下的Generic.xaml
中定义的样式。如果我将我的 Handle
样式移到那里,突然之间,它就可以工作了。如果我改为将它本地复制到 window,我已经这样做了,它不会。有趣的是查找不同。
我有一个名为 Handle
的基 class,我从中派生出多个基 class,例如 RectHandle
和 EllipseHandle
。在那些 subclasses 中,我试图覆盖默认样式键以指向 Handle
,但未应用样式定位 Handle
。我仍然必须直接或通过 'BasedOn' 样式明确定位 RectHandle
或 EllipseHandle
。我错过了什么?
这是 DefaultStyleKeyProperty 的 MSDN 摘录:
A control typically overrides the default value of this property to be its own type, but in some cases could also use a base type for which a style in the theme dictionaries exists.
这是我的代码
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}}" />
我明白了。 DefaultStyleKey
属性 仅指在主题或主题下的Generic.xaml
中定义的样式。如果我将我的 Handle
样式移到那里,突然之间,它就可以工作了。如果我改为将它本地复制到 window,我已经这样做了,它不会。有趣的是查找不同。