В GridViewColumn в listView у меня есть три кнопки (удалить, переместить элемент вверх и вниз) в одном столбце. Кнопка «Удалить» всегда будет отображаться. Однако кнопки «Вверх» и «Вниз» свернуты или нет, в зависимости от того, имеют ли они смысл (например, если в списке есть только 1 элемент, будет отображаться только кнопка удаления, если в нем более 1 элемента, первый элемент показывает только удалить и переместить кнопки вниз и последний элемент, кнопки удаления и перемещения вверх). Внешний вид кнопок такой, как показано ниже (выкладываю здесь только одну):
<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}}"/>
Кнопки содержат изображение png 24x24, как вы можете видеть выше.
Также в первой строке ListView у меня есть кнопка «Добавить» для добавления элементов в ListView. Изначально ListView пуст.
Я добавляю первый элемент в список, и он добавляется правильно, отображается кнопка с изображением внутри. Смотри ниже:
Затем я добавляю второй элемент в список, и он добавляется правильно, отображается кнопка с ее изображением, НО предыдущий элемент, который я добавил ранее в список (первый), его кнопки удаления и перемещения вниз отображаются, НО без изображения внутри (изображение исчезло). Смотри ниже:
Если я добавлю еще один элемент в список:
и так далее....
Как видите, при добавлении нового элемента в listview, во всех предыдущих пропадает изображение кнопок.
Есть идеи, что происходит?
Просто установите x:Shared = "false"
на ресурс изображения.
@Clemens Спасибо, это работает;)
Экземпляр Image
требуется для каждого экземпляра Button
.
Поэтому добавьте производный класс BitmapSource
, такой как BitmapImage
, в Window.Resources и в другом месте и ссылайтесь на него из каждого экземпляра Image
. Кроме того, я бы рекомендовал установить PresentationOptions:Заморозить в файле BitmapImage
.
<BitmapImage x:Key = "ImageDeleteKey"
UriSource = "Resources/ImageDelete.png"
PresentationOptions:Freeze = "True"/>
<Button>
<Image Source = "{StaticResource ImageDeleteKey}"/>
</Button>
Обновлено:
Решение, предложенное Клеменсом x:Shared = "False"
, тоже работает. По сравнению с этим решением это решение будет лучше с точки зрения эффективности использования памяти (меньшее использование памяти), но практическое влияние будет зависеть от размера файла изображения.
Это работает, но в BitmapImage вы забыли включить пространства имен: xmlns:PresentationOptions = "schemas.microsoft.com/winfx/2006/xaml/presentation/options" и xmlns:mc = "schemas.openxmlformats.org/markup-compatibility/2006", а также mc:Ignorable = "PresentationOptions". Если вы не включите их, PresentationOptions:Freeze не распознается, и во время разработки возникает ошибка. Поэтому, пожалуйста, правильно включите их в свой пост. Также я хотел бы знать, в чем разница между вашим и моим использованием атрибута x: Shared = "false", предложенного Клеменсом. Какой из них лучше?
И что именно делает PresentationOprtions_Freeze? Я прочитал вашу предоставленную ссылку, но я не могу ее понять. Не могли бы вы объяснить, что он делает? Какова цель его использования? Если я не использую его, что произойдет? проблемы с обновлением?
Добавлено сравнение с этим решением. Документ, на который я ссылаюсь, объясняет пространства имен и включает полезную ссылку на Freezable.
Это вполне естественно, потому что существует только один экземпляр этого элемента управления
Image
.