Path.Data样式仅适用于样式化对象的第一个实例

时间:2012-12-04 11:46:20

标签: wpf windows-phone-7 xaml styles

A有一个ListBox项,每个ListBoxItem都包含一个Path对象形式的图标,如下所示:

<ListBox.ItemTemplate>
    <DataTemplate>
        <Grid ...>
            ...
            <Path Margin="4" Style="{StaticResource ErrorIconPath}" 
                  Stretch="Uniform" Width="26" Height="26"
                  RenderTransformOrigin="0.5,0.5" Grid.Column="1" Grid.Row="1"
                  UseLayoutRounding="False"
                  HorizontalAlignment="Center" VerticalAlignment="Center" />
        </Grid>
    </DataTemplate>
</ListBox.ItemTemplate>

路径的样式包含在Appl.xamlApplication.Resources部分)中,如下所示:

<Style x:Key="ErrorIconPath" TargetType="Path">
    <Setter Property="Data" Value="F1M874.094,289.369L854.3,254.63C854.028,254.151 853.515,253.856 852.958,253.856 852.403,253.856 851.89,254.151 851.617,254.63L831.824,289.369C831.555,289.84 831.559,290.416 831.835,290.883 832.111,291.348 832.618,291.634 833.165,291.634L872.752,291.634C873.299,291.634 873.805,291.348 874.081,290.883 874.357,290.416 874.361,289.84 874.094,289.369 M855.653,287.189L850.264,287.189 850.264,282.745 855.653,282.745 855.653,287.189z M855.653,279.41L850.264,279.41 850.264,266.077 855.653,266.077 855.653,279.41z" />
</Style>

麻烦的是,只有ListBox中的第一项按预期绑定Data属性,其他属性根本不绑定它(因此它们显示为空格,但与{的大小相匹配{1}})。此外,当我在其他任何地方(即ListBox外部)使用该样式时,只会发生第一个发生的实例。

奇怪的是,如果我在Path而不是内联中定义Fill属性,它就可以正常工作并且不会出现与Style相同的问题属性。

我的猜测是,这与Path不是原始类型有关,但我没有找到任何修复。

编辑:有趣的是,当我将Data属性直接绑定到Data资源时,它可以正常工作。我仍然希望能够通过Style定义这个属性。

编辑2:我在WPF中遇到了同样的问题,当通过更多按钮使用的样式设置按钮内容的路径时。路径只显示一个按钮,其他按钮为空白。

5 个答案:

答案 0 :(得分:6)

Path.Fill是DependencyProperty,而Path.Data则不是。而是做:

<DataTemplate>
    <Grid ...>
        ...
        <ContentPresenter Content="{StaticResource MyPath}"/>
    </Grid>
</DataTemplate>

ContentPresenter.Content是一个DependencyProperty,所​​以这应该有效:

<Path x:Key="MyPath" Margin="4" Style="{StaticResource ErrorIconPath}" 
      Stretch="Uniform" Width="26" Height="26" VerticalAlignment="Center"
      RenderTransformOrigin="0.5,0.5" Grid.Column="1" Grid.Row="1"
      UseLayoutRounding="False" HorizontalAlignment="Center"
      Data="F1M874.094,289.369L854.3,254.63C854.028,254.151 853.515,253.856 852.958,253.856 852.403,253.856 851.89,254.151 851.617,254.63L831.824,289.369C831.555,289.84 831.559,290.416 831.835,290.883 832.111,291.348 832.618,291.634 833.165,291.634L872.752,291.634C873.299,291.634 873.805,291.348 874.081,290.883 874.357,290.416 874.361,289.84 874.094,289.369 M855.653,287.189L850.264,287.189 850.264,282.745 855.653,282.745 855.653,287.189z M855.653,279.41L850.264,279.41 850.264,266.077 855.653,266.077 855.653,279.41z"/>

答案 1 :(得分:4)

我猜不能分享Geometry。您是否尝试将x:Shared = "false"设置为:

<Style x:Key="ErrorIconPath" TargetType="Path">

答案 2 :(得分:3)

我在Silverlight中遇到过相同的行为,并在StackOverflow.com上问了类似的问题  (https://stackoverflow.com/q/13426198/1796930),但在我写这篇文章时,它已经过了1个月而我还没有得到一个答案。

但是,正如您在第一次编辑中提到的那样,我也可以通过创建一个将我的几何数据作为字符串创建资源然后绑定Data对象的Path属性来执行变通方法到字符串资源。

我还必须使用不同的资源(即两个不同的图标)创建除了每个对象以外的Path个对象的两个实例,然后将每个对象的可见性绑定到我的ViewModel中的属性以显示适当的。

答案 3 :(得分:2)

我非常确定你没有忘记路径样式中的笔画

<Setter Property="Stroke" Value="Red"/>

我已经在我的机器上测试了你的代码,如果上面的行添加了风格

,它工作正常

答案 4 :(得分:1)

我的第一次尝试是你的路径被破坏或无效。但后来我看到你正在使用Syncfusion Metro Studio。我用完全相同的代码尝试了它并且它运行得很好。在5个项目的数据模板中或作为单个路径项。

您是否尝试将静音设置为红色或其他?

也可以尝试使用样式定义

<Style x:Key="ErrorIconPath" TargetType="{x:Type Path}">

第三个建议是将样式定义从应用程序移动到您的页面,甚至移动到您的控件本身。

为确保不会应用默认样式,请尝试

OverridesDefaultStyle="True"

希望这会有所帮助:)