WPF UserControls:即使使用' x:Shared =" False"'

时间:2013-04-27 02:08:54

标签: 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:如果我将两个按钮的内容直接设置到图像上就可以正常工作了,但样式的整个要点就是避免它!

2 个答案:

答案 0 :(得分:11)

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

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

正确的方法是使用ControlTemplateDataTemplate

根据你的观察:

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

但是,这个:“整个造型点就是要完全避免!”是一种误解 - 样式并不意味着设置内容控件的内容,内容取决于上下文。如果您有一个重复所有按钮的视觉效果(不依赖于内容),它应该位于ControlTemplate按钮中。如果您的视觉效果取决于内容(但内容不是视觉效果),则视觉效果应位于DataTemplate

答案 1 :(得分:0)

我有一个相似的问题,这不是完全相同的事情,但是以防万一我给您我的解决方案可能会帮助其他人o :) 我以这种方式解决它(在Visual Studio 2019中,WPF应用程序中):

将图像放入项目中的文件夹中 在xaml中创建图像并将您的源代码放到这里,对于我来说,图像显示在设计窗口中,而不是在运行时显示 使用解决方案资源管理器访问项目中的图像 选择每个图像并打开属性窗口 将“生成操作”设置为“资源”,将“在存储库中复制”设置为“始终复制”

我已经做到了,我可以在运行时看到图像:)

PS:对不起,我的英语,我是法语