在WPF中,是否可以对BulletDecorator进行样式设置?

12

显然,它可以应用样式-我想知道的是是否可以在样式中定义Bullet元素,这样您就不必在XAML中一遍又一遍地重新定义它。

<BulletDecorator>
       <BulletDecorator.Bullet>
            ...my bullet UIElement here...
        </BulletDecorator.Bullet>
        <TextBlock>
            ... my text here...
        </TextBlock>
</BulletDecorator> 
3个回答

17

BulletDecorator.Bullet无法进行样式设置,而BulletDecorator本身也不是一个控件,因此不能进行模板化。

不过,您可以通过为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>

如果你只是偶尔使用,那么"<ContentControl Template=..."技术就可以了。如果你要更频繁地使用它,可以定义一个MyBullet类:

public class MyBullet : ContentControl
{
  static MyBullet()
  {
    DefaultStyleKeyProperty.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>

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


我知道这已经是10年后的事情了,但对于那些仍在使用WPF的人来说,应该是DefaultStyleKeyProperty而不是DefaultStyleKey:DefaultStyleKeyProperty.OverrideMetadata(typeof(MyBullet), new FrameworkPropertyMetadata(typeof(MyBullet))); - Matt Becker

1

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

但是你可以声明自己的类,从Decorator派生并在构造函数中设置Bullet,这样你就可以编写:

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

0

我正在寻找一个更简单的解决方案来单独设计radiobutton的bulletdecorator,并希望在这里展示我的解决方案,因为我没有找到任何好的例子。

<ControlTemplate TargetType="{x:Type RadioButton}" x:Key="RadioButtonControlTemplate">
    <BulletDecorator Background="Transparent" Cursor="Hand">
        <BulletDecorator.Bullet>
            <Grid Height="15" Width="15">
                <Ellipse x:Name="OffStyle" Margin="2" Fill="{DynamicResource RadioButtonOff}" Visibility="Visible" />
                <Ellipse x:Name="OnStyle" Margin="2" Fill="{DynamicResource RadioButtonOn}" Visibility="Hidden" />
            </Grid>
        </BulletDecorator.Bullet>
    </BulletDecorator>
    <ControlTemplate.Triggers>
        <Trigger Property="IsChecked" Value="true">
            <Setter TargetName="OnStyle" Property="Visibility" Value="Visible"/>
            <Setter TargetName="OffStyle" Property="Visibility" Value="Hidden" />
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

你可以像这样使用它
<Viewbox Grid.Row="1" Height="50" Width="50">
   <RadioButton GroupName="RadioButtonGroup" HorizontalAlignment="Center" Template="{StaticResource RadioButtonControlTemplate}" />
</Viewbox>

当单选按钮关闭或打开时,我也添加了一个样式

<DrawingBrush x:Key="RadioButtonOff" Stretch="Uniform">
    <DrawingBrush.Drawing>
        <DrawingGroup>
            <DrawingGroup.Children>
                <GeometryDrawing Geometry="F1 M 224,3.79999C 345.889,3.79999 444.7,102.611 444.7,224.5C 444.7,346.389 345.889,445.2 224,445.2C 102.111,445.2 3.30006,346.389 3.30006,224.5C 3.30006,102.611 102.111,3.79999 224,3.79999 Z ">
                    <GeometryDrawing.Pen>
                        <Pen Thickness="3.312" LineJoin="Round" Brush="#FF5C5C5C"/>
                    </GeometryDrawing.Pen>
                    <GeometryDrawing.Brush>
                        <RadialGradientBrush RadiusX="1.67044" RadiusY="1.67044" Center="0.5,0.5" GradientOrigin="0.5,0.5">
                            <RadialGradientBrush.GradientStops>
                                <GradientStop Color="#FFB9C3C6" Offset="0.253054"/>
                                <GradientStop Color="#FF5C6163" Offset="0.286441"/>
                                <GradientStop Color="#FF000000" Offset="0.329843"/>
                            </RadialGradientBrush.GradientStops>
                            <RadialGradientBrush.RelativeTransform>
                                <TransformGroup/>
                            </RadialGradientBrush.RelativeTransform>
                        </RadialGradientBrush>
                    </GeometryDrawing.Brush>
                </GeometryDrawing>
                <GeometryDrawing Geometry="F1 M 224.333,34.5277C 328.991,34.5277 413.833,119.37 413.833,224.028C 413.833,328.685 328.991,413.527 224.333,413.527C 119.675,413.527 34.8332,328.685 34.8332,224.028C 34.8332,119.37 119.675,34.5277 224.333,34.5277 Z ">
                    <GeometryDrawing.Pen>
                        <Pen Thickness="1.44" LineJoin="Round" Brush="#FF545454"/>
                    </GeometryDrawing.Pen>
                    <GeometryDrawing.Brush>
                        <RadialGradientBrush RadiusX="0.958628" RadiusY="0.958628" Center="0.232275,0.223043" GradientOrigin="0.232275,0.223043">
                            <RadialGradientBrush.GradientStops>
                                <GradientStop Color="#FFE5EEF0" Offset="0.150862"/>
                                <GradientStop Color="#FF72797B" Offset="0.5"/>
                                <GradientStop Color="#FF000406" Offset="0.909483"/>
                            </RadialGradientBrush.GradientStops>
                            <RadialGradientBrush.RelativeTransform>
                                <TransformGroup/>
                            </RadialGradientBrush.RelativeTransform>
                        </RadialGradientBrush>
                    </GeometryDrawing.Brush>
                </GeometryDrawing>
            </DrawingGroup.Children>
        </DrawingGroup>
    </DrawingBrush.Drawing>
</DrawingBrush>
<DrawingBrush x:Key="RadioButtonOn" Stretch="Uniform">
    <DrawingBrush.Drawing>
        <DrawingGroup>
            <DrawingGroup.Children>
                <GeometryDrawing Geometry="F1 M 224.3,4C 346.189,4 445,102.811 445,224.7C 445,346.589 346.189,445.4 224.3,445.4C 102.411,445.4 3.60013,346.589 3.60013,224.7C 3.60013,102.811 102.411,4 224.3,4 Z ">
                    <GeometryDrawing.Pen>
                        <Pen Thickness="3.312" LineJoin="Round" Brush="#FF5C5C5C"/>
                    </GeometryDrawing.Pen>
                    <GeometryDrawing.Brush>
                        <RadialGradientBrush RadiusX="1.67044" RadiusY="1.67044" Center="0.5,0.5" GradientOrigin="0.5,0.5">
                            <RadialGradientBrush.GradientStops>
                                <GradientStop Color="#FFB9C3C6" Offset="0.253054"/>
                                <GradientStop Color="#FF5C8A99" Offset="0.286441"/>
                                <GradientStop Color="#FF00516A" Offset="0.329843"/>
                            </RadialGradientBrush.GradientStops>
                            <RadialGradientBrush.RelativeTransform>
                                <TransformGroup/>
                            </RadialGradientBrush.RelativeTransform>
                        </RadialGradientBrush>
                    </GeometryDrawing.Brush>
                </GeometryDrawing>
                <GeometryDrawing Geometry="F1 M 224.633,34.7277C 329.291,34.7277 414.133,119.57 414.133,224.228C 414.133,328.885 329.291,413.727 224.633,413.727C 119.975,413.727 35.1333,328.885 35.1333,224.228C 35.1333,119.57 119.975,34.7277 224.633,34.7277 Z ">
                    <GeometryDrawing.Pen>
                        <Pen Thickness="1.44" LineJoin="Round" Brush="#FF545454"/>
                    </GeometryDrawing.Pen>
                    <GeometryDrawing.Brush>
                        <RadialGradientBrush RadiusX="0.958628" RadiusY="0.958628" Center="0.232275,0.223043" GradientOrigin="0.232275,0.223043">
                            <RadialGradientBrush.GradientStops>
                                <GradientStop Color="#FFE5EEF0" Offset="0.150862"/>
                                <GradientStop Color="#FF729FAE" Offset="0.5"/>
                                <GradientStop Color="#FF00516A" Offset="0.909483"/>
                            </RadialGradientBrush.GradientStops>
                            <RadialGradientBrush.RelativeTransform>
                                <TransformGroup/>
                            </RadialGradientBrush.RelativeTransform>
                        </RadialGradientBrush>
                    </GeometryDrawing.Brush>
                </GeometryDrawing>
            </DrawingGroup.Children>
        </DrawingGroup>
    </DrawingBrush.Drawing>
</DrawingBrush>

这里有result


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接