资源的路径作为按钮的内容

时间:2013-05-21 14:00:27

标签: wpf xaml wpf-controls

我想将Button的{​​{1}}设置为Content中定义的Path。所以我在资源中创建了Resources,定义了UserControl,两个Path和按钮Brushes ......一切都很好。

Style

我决定将这些资源放在单独的<UserControl ...> <UserControl.Resources> <Path x:Key="PageSmallIcon2" Stretch="Fill" Fill="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Control}}, Path=Foreground}" Stroke="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Control}}, Path=Foreground}" SnapsToDevicePixels="True" Data="F1 M 19,25L 27,25L 27,33L 19,33L 19,25 Z M 19,36L 27,36L 27,44L 19,44L 19,36 Z M 31,25L 57,25L 57,33L 31,33L 31,25 Z M 19,47L 27,47L 27,55L 19,55L 19,47 Z "/> <SolidColorBrush x:Key="MainColorBrush2" Color="Orange"/> <SolidColorBrush x:Key="WhiteColorBrush2" Color="WhiteSmoke"/> <Style x:Key="TransparentButtonStyle2" TargetType="{x:Type Button}"> <Setter Property="Foreground" Value="{StaticResource WhiteColorBrush2}"/> <Setter Property="Height" Value="25"/> <Setter Property="Width" Value="25"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Grid> <Rectangle Fill="Transparent"/> <ContentPresenter x:Name="contentPresenter" Content="{TemplateBinding Content}" Margin="2" /> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsPressed" Value="True"> <Setter Property="Foreground" Value="{StaticResource MainColorBrush2}"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </UserControl.Resources> <Grid> <Button Command="{Binding Path=SmallPageSizeCommand}" Style="{StaticResource TransparentButtonStyle2}" Content="{StaticResource PageSmallIcon2}"/> ... </Grid> </UserControl> 中。我打算有更多的ResourceDictionariesPaths ...我还希望只有一种按钮样式。基本上我是这样做的,因为我的每个按钮都有样式,Brushes每个特定的Path都是Button的{​​{1}}的一部分。

所以我创建了三个Button ControlTemplateResourceDictionariesColors.xaml,然后我更新了Icons.xaml

Controls.xaml

当我按App.xaml时,<Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Theme/Colors.xaml"/> <ResourceDictionary Source="Theme/Icons.xaml"/> <ResourceDictionary Source="Theme/Controls.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> 的{​​{1}}属性未更新。有人可以解释为什么它不能在单独的Path中工作并为我提供这个问题的解决方案吗?

更新

所以我发现问题出在Fill。如果Button中有ResourceDictionaries PathPath中的颜色和<UserControl.Resources>中的按钮样式,一切都会有效。

我还发现当我在Colors.xaml中使用Controls.xaml时,我在Path中使用它作为按钮的内容

Icons.xaml

我有UserControl的多个实例...然后<Button Command="{Binding Path=SmallPageSizeCommand}" Style="{StaticResource TransparentButtonStyle2}" Content="{StaticResource PageSmallIcon2}"/> 一次只出现在UserControl的一个实例中。

1 个答案:

答案 0 :(得分:14)

原因:

  

我有多个UserControl实例...然后Path一次只出现在一个UserControl实例中

是因为你在XAML中给予不同的父元素。您要将多个Button控件的内容设置为资源中定义的Path Shape。出于优化目的,对资源的每个引用都将默认返回对象的相同实例,并且因为在WPF中每个元素一次只能有一个父元素,所以只有XAML声明中的最后一个Button才能拥有它的内容集到期望的Path。 要解决此问题,您可以使用x:Shared =“False”属性标记资源。在这种情况下,XAML Parser将为每个Reference生成Path元素的新实例。