と呼ばれる基本クラスがあり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>
繰り返しますが、これは機能しません。
私の回避策は、最初のスタイルに基づいて他の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}}" />
私はそれを考え出した。DefaultStyleKey
プロパティは、唯一のテーマで定義されたスタイルを指し、またはでGeneric.xaml
テーマの下で。Handle
そこに自分のスタイルを移すと、突然、うまくいきます。代わりに、私が行ったウィンドウのローカルにコピーした場合、コピーされません。ルックアップが異なるのは興味深いことです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加