簡體   English   中英

為什么DefaultStyleKey不更改我的子類的默認樣式?

[英]Why doesn't DefaultStyleKey change the default style for my subclasses?

我有一個名為Handle的基類,我從中派生了幾個基類,如RectHandleEllipseHandle 在這些子類我試圖覆蓋默認樣式鍵指向Handle ,但風格定位Handle不適用。 我仍然需要直接或通過'BasedOn'樣式明確地定位RectHandleEllipseHandle 我錯過了什么?

這是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM