将新项目添加到 WPF 列表视图后,按钮中包含的图像消失

Images contained in the buttons disappear after adding a new item to the WPF listview

在 listView 的 GridViewColumn 中,我在同一列中有三个按钮(删除、上移和下移项目)。删除按钮将始终显示。但是,上移和下移按钮是否折叠取决于它们是否有意义(例如,如果列表视图只有一个项目,则只会显示删除按钮,如果有多个项目,则第一个项目仅显示删除和移动向下按钮和最后一个项目,删除和向上移动按钮)。按钮的外观如下(我post这里只有一个):

<Image x:Key="ImgDelete" Source="pack://application:,,,/Sys;component/Resources/ImageDelete.png"

<Button Content="{StaticResource ImgDelete}"
        Margin="10 0 0 0"
        Height="24"
        Width="24"
        VerticalAlignment="Stretch" 
        HorizontalAlignment="Stretch"
        Command="{Binding Path=DataContext.DeleteCommand, ElementName=myListView}"                             
        CommandParameter="{Binding (ItemsControl.AlternationIndex),
                           RelativeSource={RelativeSource AncestorType=ListViewItem}}"/>

如上所示,按钮包含 24x24 png 图像。

另外,在 ListView 的第一行中,我有一个“添加”按钮,用于将项目添加到 ListView。 最初 ListView 是空的。

我将第一项添加到列表视图并且添加正确,显示了带有图像的按钮。见下文:

然后我将第二个项目添加到列表视图并且添加正确,显示了带有图像的按钮但是我之前添加到列表视图的上一个项目(第一个),它的删除和下移按钮是显示但内部没有图像(图像已消失)。见下文:

如果我向列表视图添加另一个项目:

等等....

如您所见,将新项目添加到列表视图时,在所有之前的列表视图中,按钮的图像都消失了。

知道发生了什么吗?

每个 Button 实例都需要一个 Image 实例。

因此添加 BitmapSource 的派生 class,例如 Window.Resources 和其他地方的 BitmapImage,并从每个 Image 实例引用它。此外,我建议在 BitmapImage.

中设置 PresentationOptions:Freeze
<BitmapImage x:Key="ImageDeleteKey"
             UriSource="Resources/ImageDelete.png"
             PresentationOptions:Freeze="True"/>
<Button>
    <Image Source="{StaticResource ImageDeleteKey}"/>
</Button>

编辑:

Clemens x:Shared="False" 建议的解决方案也有效。与那个解决方案相比,这个解决方案在内存效率(更少的内存使用)上会更好,但实际影响将取决于图像文件的大小。