2009-11-06 16 views
8

Obviamente, puede haber un estilo aplicado a él - lo que estoy tratando de averiguar si su posible definir el elemento de bala en el estilo, por lo que no tiene que seguir definiendo una y otra vez en el xaml¿Es posible diseñar un BulletDecorator en WPF?

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

Respuesta

11

BulletDecorator.Bullet no puede ser de estilo, y BulletDecorator no es un control por lo que no puede ser templado.

Sin embargo, usted puede conseguir el efecto en XAML pura mediante la definición de un ControlTemplate para ContentControl así:

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

ya se puede utilizar de esta manera:

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

Si lo utiliza solamente una algunas veces, la técnica "< ContentControl Template = ..." funciona bien. Si se va a utilizar con mayor frecuencia, se puede definir una clase MyBullet:

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

luego mueva el ControlTemplate en Temática/Generic.xaml (o un diccionario fusionó en él) y se envuelve con esto:

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

Si hace esto, puede utilizar:

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

cualquier lugar de su aplicación.

1

La viñeta no es una propiedad de dependencia, por lo que no se puede diseñar.

Pero se puede, por supuesto, declarar sus propias clases que se derivan de decorador y establecer la bala en el constructor, por lo que se podría escribir:

<local:MyDecorator> 
    <TextBlock /> 
</local:MyDecorator> 
Cuestiones relacionadas