我在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
,图片确定。我再次打开UserControl A
,图像消失了。如果我先打开UserControl B
,然后再打开UserControl A
,则发生的情况相同,最后一个“拥有”图像。我到处走,所有解决方案都指向
x:Shared="False"
,URI notation
和Build Action
...。我都应用了它们,但问题仍然存在。我还尝试了清洁和重建,但均未成功。我想念什么?谢谢!
PS:如果我直接将两个按钮的内容都设置为图像,则可以正常工作,但整个样式的目的是避免这种情况!
最佳答案
问题不是BitmapImage
,它是按钮 setter 中的内容-它创建一次,因此必须在实例之间“跳转”。
简单但不是WPF风格的解决方案是在样式上设置x:Shared="False"
。
正确的方法是使用ControlTemplate
或DataTemplate
。
根据您的观察:
“如果我直接将两个按钮的内容都设置到图像上,就可以正常工作”-这是因为要创建两个不同的Image
对象实例。
但是,这是:“样式的全部目的就是要避免这种情况!”这是一个误解-样式不是要设置内容控件的内容,内容取决于上下文。如果您的视觉效果对于所有按钮都是重复的(不依赖于内容),则该视觉效果应位于按钮的ControlTemplate
中。如果您具有依赖于内容的视觉效果(但内容不是视觉效果),则它应位于DataTemplate
中。
关于wpf - WPF用户控件: Image disappears even with 'x:Shared=“False” ',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16247577/