DefaultStyleKeyがサブクラスのデフォルトスタイルを変更しないのはなぜですか?

マークA.ドノホー

と呼ばれる基本クラスがありHandle、そこからとなどのいくつかの基本クラスを派生さRectHandleEllipseHandleます。これらのサブクラスでは、ポイントするデフォルトのスタイルキーをオーバーライドしようとしました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>

繰り返しますが、これは機能しません。

私の回避策は、最初のスタイルに基づいて他の2つのスタイルを作成することですが、それが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}}" />
マークA.ドノホー

私はそれを考え出した。DefaultStyleKeyプロパティは、唯一のテーマで定義されたスタイルを指し、またはでGeneric.xamlテーマの下で。Handleそこに自分のスタイルを移すと、突然、うまくいきます。代わりに、私が行ったウィンドウのローカルにコピーした場合、コピーされません。ルックアップが異なるのは興味深いことです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

サブクラスが仮想関数をオーバーライドするのに、親クラスのデフォルト関数パラメーターを変更できないのはなぜですか?

分類Dev

ブートストラップがデフォルトのフォントサイズを10pxに設定しているのはなぜですか?

分類Dev

std :: moveがデフォルトのmoveコンストラクターでソース変数をデフォルト値に変更しないのはなぜですか?

分類Dev

サブクラスをデフォルトのパラメーターでオーバーライドする必要があるのはなぜですか?

分類Dev

Javaがデフォルトでクラス変数のみを初期化し、ローカル変数は初期化しないのはなぜですか?

分類Dev

Javaがデフォルトでクラス変数のみを初期化し、ローカル変数は初期化しないのはなぜですか?

分類Dev

WindowsがファイルブロックWebサイトをホストしないのはなぜですか?

分類Dev

デフォルトのmoveコンストラクターがnoexceptではないのはなぜですか?

分類Dev

デフォルトのmoveコンストラクターがnoexceptではないのはなぜですか?

分類Dev

サブクラス化時に関数が変更されても、関数に渡されるプロトコルのデフォルト値が変更されないのはなぜですか?

分類Dev

スタックオブジェクトが作成された後にデフォルト値を変更するのはなぜですか?

分類Dev

データクラスのクラス属性宣言に変更可能なデフォルトを設定できないのはなぜですか?

分類Dev

子クラスに子クラスオブジェクトを作成しないのに、親クラスにデフォルトのコンストラクターが必要なのはなぜですか?

分類Dev

インデックスルートの変更が機能しないのはなぜですか?

分類Dev

ラベルのフォントサイズを変更できないのはなぜですか?

分類Dev

新しいオブジェクトを作成すると、そのクラスの*すべての*インスタンスのフィールドが変更される可能性があるのはなぜですか?

分類Dev

オブジェクトを直接インスタンス化するときではなく、ポインタを使用するときにクラスメンバーのデフォルト値が使用されないのはなぜですか?

分類Dev

C#がデフォルトで親のコンストラクターの使用を許可しないのはなぜですか?

分類Dev

インデックスファイル(html / php)のないディレクトリに対してブラウザによって生成されたデフォルトの「インデックス」ページを変更することは可能ですか?

分類Dev

ベクトルのサイズ変更には、C ++> = 11のデフォルトコンストラクタが必要なようです

分類Dev

DynamoDBでインデックス/テーブルの名前変更がサポートされていないのはなぜですか?

分類Dev

Scalaでサブタイプを定義するときに、共変をデフォルトとして設定しないのはなぜですか?

分類Dev

これがデフォルトのコンストラクターを作成しないのはなぜですか?

分類Dev

Javaがデフォルトのコピーコンストラクタを提供しないのはなぜですか?

分類Dev

些細なデフォルトコンストラクターがアクションを実行しない場合、mallocを使用して簡単に構築可能なオブジェクトを作成できないのはなぜですか?

分類Dev

UbuntuインターフェースからAndroidデバイスのフォルダーの名前を変更できないのはなぜですか?

分類Dev

UbuntuインターフェースからAndroidデバイスのフォルダーの名前を変更できないのはなぜですか?

分類Dev

サブクラスコンストラクター-サブクラスコンストラクターにデフォルトのコンストラクターが存在する必要があるのはなぜですか?

分類Dev

PHP include()がファイルアクセス時間を変更しないのはなぜですか?

Related 関連記事

  1. 1

    サブクラスが仮想関数をオーバーライドするのに、親クラスのデフォルト関数パラメーターを変更できないのはなぜですか?

  2. 2

    ブートストラップがデフォルトのフォントサイズを10pxに設定しているのはなぜですか?

  3. 3

    std :: moveがデフォルトのmoveコンストラクターでソース変数をデフォルト値に変更しないのはなぜですか?

  4. 4

    サブクラスをデフォルトのパラメーターでオーバーライドする必要があるのはなぜですか?

  5. 5

    Javaがデフォルトでクラス変数のみを初期化し、ローカル変数は初期化しないのはなぜですか?

  6. 6

    Javaがデフォルトでクラス変数のみを初期化し、ローカル変数は初期化しないのはなぜですか?

  7. 7

    WindowsがファイルブロックWebサイトをホストしないのはなぜですか?

  8. 8

    デフォルトのmoveコンストラクターがnoexceptではないのはなぜですか?

  9. 9

    デフォルトのmoveコンストラクターがnoexceptではないのはなぜですか?

  10. 10

    サブクラス化時に関数が変更されても、関数に渡されるプロトコルのデフォルト値が変更されないのはなぜですか?

  11. 11

    スタックオブジェクトが作成された後にデフォルト値を変更するのはなぜですか?

  12. 12

    データクラスのクラス属性宣言に変更可能なデフォルトを設定できないのはなぜですか?

  13. 13

    子クラスに子クラスオブジェクトを作成しないのに、親クラスにデフォルトのコンストラクターが必要なのはなぜですか?

  14. 14

    インデックスルートの変更が機能しないのはなぜですか?

  15. 15

    ラベルのフォントサイズを変更できないのはなぜですか?

  16. 16

    新しいオブジェクトを作成すると、そのクラスの*すべての*インスタンスのフィールドが変更される可能性があるのはなぜですか?

  17. 17

    オブジェクトを直接インスタンス化するときではなく、ポインタを使用するときにクラスメンバーのデフォルト値が使用されないのはなぜですか?

  18. 18

    C#がデフォルトで親のコンストラクターの使用を許可しないのはなぜですか?

  19. 19

    インデックスファイル(html / php)のないディレクトリに対してブラウザによって生成されたデフォルトの「インデックス」ページを変更することは可能ですか?

  20. 20

    ベクトルのサイズ変更には、C ++> = 11のデフォルトコンストラクタが必要なようです

  21. 21

    DynamoDBでインデックス/テーブルの名前変更がサポートされていないのはなぜですか?

  22. 22

    Scalaでサブタイプを定義するときに、共変をデフォルトとして設定しないのはなぜですか?

  23. 23

    これがデフォルトのコンストラクターを作成しないのはなぜですか?

  24. 24

    Javaがデフォルトのコピーコンストラクタを提供しないのはなぜですか?

  25. 25

    些細なデフォルトコンストラクターがアクションを実行しない場合、mallocを使用して簡単に構築可能なオブジェクトを作成できないのはなぜですか?

  26. 26

    UbuntuインターフェースからAndroidデバイスのフォルダーの名前を変更できないのはなぜですか?

  27. 27

    UbuntuインターフェースからAndroidデバイスのフォルダーの名前を変更できないのはなぜですか?

  28. 28

    サブクラスコンストラクター-サブクラスコンストラクターにデフォルトのコンストラクターが存在する必要があるのはなぜですか?

  29. 29

    PHP include()がファイルアクセス時間を変更しないのはなぜですか?

ホットタグ

アーカイブ