是否可以在WPF中设置BulletDecorator的样式?

时间:2009-11-06 00:15:33

标签: wpf styles

显然它可以应用一种样式 - 我试图找出是否有可能在样式中定义Bullet元素,因此你不必在xaml中反复定义它

<BulletDecorator>
       <BulletDecorator.Bullet>
            ...my bullet UIElement here...
        </BulletDecorator.Bullet>
        <TextBlock>
            ... my text here...
        </TextBlock>
</BulletDecorator> 

2 个答案:

答案 0 :(得分:12)

BulletDecorator.Bullet无法设置样式,并且BulletDecorator不是Control,因此无法模板化。

但是,您可以通过为ContentControl定义ControlTemplate来获得纯XAML中的效果,如下所示:

<ControlTemplate x:Key="BulletTemplate" TargetType="{x:Type ContentControl}">
  <BulletDecorator>
    <BulletDecorator.Bullet>
      ...my bullet UIElement here...
    </BulletDecorator.Bullet>
    <ContentPresenter />
  </BulletDecorator>
</ControlTemplate>

现在您可以像这样使用它:

<ContentControl Template="{StaticResource BulletTemplate}">
  <TextBlock />
</ContentControl>

如果您只使用它几次,“&lt; ContentControl Template = ...”技术可以正常工作。如果您打算更频繁地使用它,可以定义一个MyBullet类:

public class MyBullet : ContentControl
{
  static MyBullet()
  {
    DefaultStyleKey.OverrideMetadata(typeof(MyBullet), new FrameworkPropertyMetadata(typeof(MyBullet));
  }
}

然后将您的ControlTemplate移动到Theme / Generic.xaml(或合并到其中的字典)并用它包装:

<Style TargetType="{x:Type local:MyBullet}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate
        ...
    </Setter.Value>
  </Setter>
</Style>

如果您这样做,可以使用:

<local:MyBullet>
  <TextBox />
</local:MyBullet>

您应用程序中的任何位置。

答案 1 :(得分:1)

Bullet不是依赖属性,因此无法设置样式。

但是你当然可以声明你自己的派生派生的类并在构造函数中设置Bullet,所以你可以写:

<local:MyDecorator>
  <TextBlock />
</local:MyDecorator>