8

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>

Path 的样式包含在Appl.xaml( Application.Resourcessection) 中,如下所示:

<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 之外)使用该样式时,只有发生的第一个实例会绑定。

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

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

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

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

4

5 回答 5

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"/>
于 2012-12-09T04:33:44.443 回答
4

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

<Style x:Key="ErrorIconPath" TargetType="Path">
于 2012-12-13T23:38:38.077 回答
3

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

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

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

于 2012-12-14T23:43:49.310 回答
2

我很确定你没有忘记路径风格的笔画

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

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

于 2012-12-10T10:59:31.160 回答
1

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

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

也可以试试这个样式定义

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

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

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

OverridesDefaultStyle="True"

希望这可以帮助 :)

于 2012-12-14T14:14:20.680 回答