将新项目添加到 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"
建议的解决方案也有效。与那个解决方案相比,这个解决方案在内存效率(更少的内存使用)上会更好,但实际影响将取决于图像文件的大小。
在 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
.
<BitmapImage x:Key="ImageDeleteKey"
UriSource="Resources/ImageDelete.png"
PresentationOptions:Freeze="True"/>
<Button>
<Image Source="{StaticResource ImageDeleteKey}"/>
</Button>
编辑:
Clemens x:Shared="False"
建议的解决方案也有效。与那个解决方案相比,这个解决方案在内存效率(更少的内存使用)上会更好,但实际影响将取决于图像文件的大小。