如何设计WPF ToggleButton的样式,如星形按钮
如何设计WPF ToggleButton的样式,如星形按钮,wpf,expression-blend,wpf-style,Wpf,Expression Blend,Wpf Style,appbar_star静态资源是从 开始切换按钮样式 <Style x:Key="StarToggleButtonStyle" TargetType="ToggleButton"> <Setter Property="Foreground" Value="White"/> <Setter Property="BorderBrush" Value="Black"/> <Setter Property="BorderThickness
appbar_star
静态资源是从
开始切换按钮样式
<Style x:Key="StarToggleButtonStyle" TargetType="ToggleButton">
<Setter Property="Foreground" Value="White"/>
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
<ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
RecognizesAccessKey="True"
ContentTemplate="{TemplateBinding ContentTemplate}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Margin="{TemplateBinding Padding}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
</Border>
<ControlTemplate.Triggers>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<ToggleButton cal:Message.Attach="Favorite($dataContext)" Width="15" Height="15" Style="{StaticResource StarToggleButtonStyle}" Margin="10,0,0,0">
<Rectangle Width="10" Height="10" Fill="{Binding Path=Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ToggleButton}}}">
<Rectangle.OpacityMask>
<VisualBrush Stretch="Fill" Visual="{StaticResource appbar_star}" />
</Rectangle.OpacityMask>
</Rectangle>
</ToggleButton>
用法
<Style x:Key="StarToggleButtonStyle" TargetType="ToggleButton">
<Setter Property="Foreground" Value="White"/>
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
<ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
RecognizesAccessKey="True"
ContentTemplate="{TemplateBinding ContentTemplate}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Margin="{TemplateBinding Padding}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
</Border>
<ControlTemplate.Triggers>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<ToggleButton cal:Message.Attach="Favorite($dataContext)" Width="15" Height="15" Style="{StaticResource StarToggleButtonStyle}" Margin="10,0,0,0">
<Rectangle Width="10" Height="10" Fill="{Binding Path=Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ToggleButton}}}">
<Rectangle.OpacityMask>
<VisualBrush Stretch="Fill" Visual="{StaticResource appbar_star}" />
</Rectangle.OpacityMask>
</Rectangle>
</ToggleButton>
然而,以下是我从上述标记中得到的信息:
我希望边框沿着内容图标,而不是方形边框。如何做到这一点?我采用了一种稍有不同的方法,从您列出的资源中抓取了带有路径的
画布,并在Kaxaml
中使用自定义ControlTemplate
(我想这是您所追求的行为):
重要的一点是,我们使用Path
上的StrokeThickness
和Stroke
属性来提供控件的轮廓;在选择按钮之前,Fill
是透明的,然后在切换按钮时,触发器负责将Fill
属性更改为黄色
分别切换和不切换。或者用一个圆代替矩形。我不明白。。。矩形与任何东西有什么关系?现代图标中的图标大多是画布,因此我使用OpacityMask的矩形来放置图标,并使其成为ToggleButton的内容。我愿意接受建议。我可能不明白你在说什么。当您谈到“边框”时,我假设它来自您引用和讨论的矩形,可能还有它的任何默认样式。也许我很困惑。你是在追求视觉效果(轮廓),还是想让可点击区域跟随形状?我正在尝试创建一个星形按钮。就这样。如果我从StarToggleButtonStyle中删除
,我将得到一个星形按钮,因为我将按钮的内容设置为星形图标。问题是,如果没有选中ToggleButton,我希望星形是透明的,带有边框。选中ToggleButton时,我希望星形为黄色填充。我知道如何使用触发器,但我不知道如何显示恒星周围的边界。这太棒了。谢谢,但是我怎样才能绑定这个按钮的宽度/高度?它太大了,我试图用模板绑定画布的宽度/高度,但不起作用。您必须将宽度
/高度
绑定更改为宽度=“{TemplateBinding width}”
,高度=“{TemplateBinding height}
。在控制模板
中的画布
/路径
(我相信它只在路径
上需要)。它不起作用。我所做的是将画布包装到
中,并对ViewBox的宽度/高度进行模板绑定。谢谢