2015-10-05 71 views
1

我有一个名为Handle的基类,我从中推导出几个基类,如RectHandleEllipseHandle。在这些子类中,我试图覆盖默认样式键指向Handle,但不适用以Handle为目标的样式。我仍然必须直接或通过'BasedOn'风格明确地定位RectHandleEllipseHandle。我错过了什么?为什么DefaultStyleKey不会改变我的子类的默认样式?

下面是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}}" /> 
+0

你的解决方法是正确的方式 – Spawn

+0

我看到你删除了你原来的评论,指向我的解决方案。但是这并没有明确说明如何设置DefaultStyleKeyProperty的元数据。当然,如果情况并非如此,那么您的解决方案仍然有效,但如果您设置了该解决方案,则不需要“BasedOn”。 – MarqueIV

回答

1

我想通了。 DefaultStyleKey属性仅指在主题中定义的样式,或者在主题下的Generic.xaml中定义的样式。如果我在那里移动我的手柄风格,那么突然它就会起作用。如果我将它复制到窗口,我已经完成了,但它没有。有趣的是,查找是不同的。

相关问题