8

アイテムの 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.xaml(Application.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 の外側) で使用すると、最初に発生したインスタンスのみがバインドされます。

奇妙なことに、たとえばインラインFillではなくプロパティを定義するStyleと、問題なく機能し、プロパティと同じ問題が発生しませんPath

私の推測では、プリミティブ型ではないことと関係があると思いますがData、修正は見つかりませんでした。

編集:興味深いことに、プロパティをリソースにData直接バインドすると機能します。System.Stringただし、スタイルを介してこのプロパティを定義できるようにしたいと考えています。

編集 2:より多くのボタンで使用されるスタイルを介してボタンのコンテンツへのパスを設定するときに、WPF で同じ問題に遭遇しました。パスは 1 つのボタンだけに表示され、他のボタンは空白です。

4

5 に答える 5

6

Path.Fill は DependencyProperty ですが、Path.Data はそうではありません。代わりに次のようにします。

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

ContentPresenter.ContentDependencyProperty であるため、これは機能するはずです。

<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
于 2012-12-14T23:43:49.310 に答える
2

ここでパススタイルのストロークを忘れていないことは間違いありません。

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

私は私のマシンであなたのコードをテストしました、上記の行がスタイルで追加された場合、それはうまくいきました

于 2012-12-10T10:59:31.160 に答える
1

私の最初の考えは、あなたの道が壊れているか、無効になるだろうということでした。しかし、あなたがSyncfusionMetroStudioを使用しているのを見ました。私はあなたが持っているのとまったく同じコードでそれを試しました、そしてそれは非常にうまくいきました。5アイテムのデータテンプレートまたは単一のパスアイテムとして。

塗りつぶしを静的に赤などに設定しようとしましたか?

また、スタイル定義にこれを試してみてください

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

3番目の提案は、スタイル定義をアプリからページ、さらにはコントロール自体に移動することです。

デフォルトのスタイルが適用されないことを確認するには、

OverridesDefaultStyle="True"

お役に立てれば :)

于 2012-12-14T14:14:20.680 に答える