Можно ли создать стиль BulletDecorator в WPF?

очевидно, что к нему может быть применен стиль - что я пытаюсь выяснить, возможно ли определить элемент Bullet в стиле, поэтому вам не нужно продолжать определять его снова и снова в xaml

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

2 ответов


BulletDecorator.Пуля не может быть стилизовано, и BulletDecorator-это не контроль, поэтому он не может быть шаблонных.

однако вы можете получить эффект в чистом XAML, определив ControlTemplate для ContentControl следующим образом:

<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>

если вы используете его только несколько раз, "

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

затем переместите ControlTemplate в тему / Generic.xaml (или словарь, объединенный в него) и оберните его следующим образом:

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

если вы это сделаете, вы можете использовать:

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

в любом месте в вашем приложении.


Bullet не является свойством зависимости, поэтому его нельзя стилизовать.

но вы, конечно, можете объявить свои собственные классы, производные от Decorator и установить пулю в конструкторе, чтобы вы могли написать:

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