[英]Why doesn't DefaultStyleKey change the default style for my subclasses?
我有一個名為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}}" />
我想到了。 DefaultStyleKey
屬性僅引用主題中定義的樣式 ,或主題下的Generic.xaml
定義的樣式 。 如果我在那里移動我的Handle
風格,突然之間就可以了。 如果我把它本地復制到窗口,我已經完成了,它沒有。 有趣的是查找不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.