【问题标题】:Path.Data styling works only on first instance of styled objectPath.Data 样式仅适用于样式对象的第一个实例
【发布时间】:2012-12-04 11:46:20
【问题描述】:

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 属性,其他项根本不绑定它(因此它们显示为空格,但与 Path 的大小匹配)。此外,当我在其他任何地方(即在 ListBox 之外)使用该样式时,只有发生的第一个实例会绑定。

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

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

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

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

【问题讨论】:

    标签: wpf windows-phone-7 xaml styles


    【解决方案1】:

    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"/>
    

    【讨论】:

    • 但是这样我就失去了内联设置路径特定属性的选项,我需要这样做(例如动态设置 Fill 属性)
    • 我对您的要求感到困惑。让我们倒退并从 ItemsControl(您的 ListBox)开始。它有一堆项目(从对象派生)。它们可能是强类型的。您有一个 ErrorItem 类型的项目,它应该有一个显示 ErrorIcon 路径的 DataTemplate。所有其他项目可能都有不同的 DataTemplates 来显示有效信息,每个项目都有不同的 w/e 路径填充颜色。但是您正在设置 ItemTemplate 属性,我将其解释为“我的 ListBox 中的所有项目都是需要以这种特殊方式显示的错误项目。
    • 抱歉耽搁了,但这里是:你是对的,并非我的 ItemsContainer 中的所有项目都是错误的,它们要么是“信息”、“警告”或“错误”。我决定使用单个模板的原因是这些项目仅通过图标的 Fill 属性来区分 - 黑色表示信息(不可见),黄色表示警告,红色表示错误。这就是为什么我需要访问绑定它的 Path 的 Fill 属性。
    【解决方案2】:

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

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

    【讨论】:

    • 优秀!正是我需要的! ;)
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      我很确定你没有忘记这里的路径样式的笔划

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

      我已经在我的机器上测试了你的代码,如果在样式中添加了上面的行,它工作正常

      【讨论】:

      • 抱歉,您的解决方案不起作用。您不需要设置 Stroke 属性,Fill 属性应该这样做。
      • 是的,我做了,只是没有将它包含在我的示例中(它是通过绑定和转换器完成的,我想让示例尽可能清晰)。
      【解决方案5】:

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

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

      也可以试试这个样式定义

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

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

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

      OverridesDefaultStyle="True"
      

      希望这会有所帮助:)

      【讨论】:

        猜你喜欢
        • 2018-01-06
        • 2018-03-04
        • 2015-10-19
        • 2016-04-03
        • 1970-01-01
        • 2020-02-13
        • 1970-01-01
        • 2020-05-12
        • 2017-12-31
        相关资源
        最近更新 更多