wpf - WPF用户控件: Image disappears even with 'x:Shared=“False” '

标签 wpf image xaml user-controls resources

我在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 notationBuild Action...。我都应用了它们,但问题仍然存在。我还尝试了清洁和重建,但均未成功。

我想念什么?谢谢!

PS:如果我直接将两个按钮的内容都设置为图像,则可以正常工作,但整个样式的目的是避免这种情况!

最佳答案

问题不是BitmapImage,它是按钮 setter 中的内容-它创建一次,因此必须在实例之间“跳转”。

简单但不是WPF风格的解决方案是在样式上设置x:Shared="False"

正确的方法是使用ControlTemplateDataTemplate

根据您的观察:

“如果我直接将两个按钮的内容都设置到图像上,就可以正常工作”-这是因为要创建两个不同的Image对象实例。

但是,这是:“样式的全部目的就是要避免这种情况!”这是一个误解-样式不是要设置内容控件的内容,内容取决于上下文。如果您的视觉效果对于所有按钮都是重复的(不依赖于内容),则该视觉效果应位于按钮的ControlTemplate中。如果您具有依赖于内容的视觉效果(但内容不是视觉效果),则它应位于DataTemplate中。

关于wpf - WPF用户控件: Image disappears even with 'x:Shared=“False” ',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16247577/

相关文章:

c# - 带有绑定(bind)文本的 WPF 文本 block 不会滚动

c# - 如何将列表列表绑定(bind)到 WPF 中的列表框?

c# - 停止 ItemsControls 共享过滤器

wpf - MVVM 中的事件绑定(bind)

java - 将Java中的二维数组转换为图像

html - 创建创建声音HTML的图像按钮

html - 从服务器加载高分辨率图像的低分辨率版本(非 JavaScript 解决方案)

wpf - 将 AlternationIndex 与 Visibility 结合起来

wpf - 在 ‘templated child element’内部访问父级属性的正确方法

c# - 设置整个窗口的前景色