WPF UserControls: изображение исчезает даже с 'x: Shared= "False"'



Я определил стиль в ResourceDictionary для кнопки с изображением:



<Style x:Key="BotonIrAInicioStyle" TargetType="Button">
<Setter Property="Margin" Value="0"/>
<Setter Property="Width" Value="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight}"/>
<Setter Property="Content">
<Setter.Value>
<Image Margin="2" Source="{StaticResource IconoDashboardBlanco}" MaxHeight="20" Stretch="Uniform"
RenderOptions.BitmapScalingMode="HighQuality"/>
</Setter.Value>
</Setter>
</Style>


Источник изображения определяется в другом ResourceDictionary в той же сборке и помечается как x:Shared="False":



<BitmapImage x:Key="IconoDashboardBlanco" x:Shared="False"
UriSource="pack://application:,,,/QualityFramework;component/Images/dashboard64X64.png"/>


Поскольку стиль будет использоваться в другой сборке, я использовал обозначение "pack://application:,,," для ссылки на изображение. Значение Build Action для изображения равно Resource (Do not copy to output directory).

В основной сборке у меня есть два UserControls, которые отображают кнопку с одинаковым стилем:



<Button DockPanel.Dock="Left" Style="{StaticResource BotonIrAInicioStyle}" Click="BotonIrAInicio_Click"/> (Click event has nothing to do with the problem)


Задача:



Я открываю UserControl A содержит кнопку с изображением, и изображение отображается нормально. Затем я открываю UserControl B, содержащий идентичную кнопку, изображение ok. Я снова открываю UserControl A, и изображение исчезает. То же самое происходит, если я открываю UserControl B, а затем UserControl A, последний "владеет" изображением.



Я ходил везде, и все решения указывают на x:Shared="False", URI notation и Build Action... Я применил все из них, и проблема все еще происходит. Я также пытался очистить и восстановить здание, но безуспешно.

Кто я такой? пропал? Спасибо!



PS: Если я устанавливаю содержимое обеих кнопок на изображение напрямую, это работает нормально, но весь смысл стиля заключается в том, чтобы избежать именно этого!

655   1  

1 ответ:

Проблема не в BitmapImage, а в содержимом в сеттере кнопки - он создается один раз и поэтому должен "прыгать" между экземплярами.

Простое, но не WPF-isque, решение-это установка x:Shared="False" на стиль.

Правильный способ-использовать ControlTemplate или DataTemplate.

Из Ваших наблюдений:

"если я установлю содержимое обеих кнопок непосредственно на изображение, оно будет работать нормально " - это потому, что для этого вы создадите два разных экземпляра Image объект.

Но, это: " весь смысл стиля состоит в том, чтобы избежать именно этого! " - это заблуждение-стили не предназначены для задания содержания элементов управления контентом, содержание зависит от контекста. Если у вас есть визуальный элемент, который повторяется для всех кнопок (без зависимости от содержимого), он должен находиться в ControlTemplate для кнопки. Если у вас есть визуальный элемент, который зависит от содержимого (но содержимое не является визуальным), он должен находиться в DataTemplate.

Comments

    Ничего не найдено.