6

ResourceDictionary我在 a中为带有图像的按钮定义了一种样式:

<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", theURI notationBuild Action... 我应用了所有这些,但问题仍然存在。我也尝试过清洁和重建,但没有成功。

我错过了什么?谢谢!

PS:如果我将两个按钮的内容直接设置为图像,它可以正常工作,但造型的重点是要避免这种情况!

4

2 回答 2

12

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

简单但不是 WPFx:Shared="False"风格的解决方案是设置样式。

正确的方法是使用ControlTemplateor DataTemplate

根据您的观察:

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

但是,这:“样式的全部意义在于避免这种情况! ”是一种误解——样式并不意味着设置内容控件的内容,内容取决于上下文。如果您有一个对所有按钮重复的视觉效果(不依赖于内容),它应该驻留在ControlTemplate按钮中。如果您有一个依赖于内容的视觉对象(但内容不是视觉对象),它应该驻留在DataTemplate.

于 2013-04-28T14:18:32.047 回答
0

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

将您的图像放在项目中的文件夹中 在 xaml 中创建图像并放置您的源 在这一点上,图像显示在设计窗口中,但不在运行时使用解决方案资源管理器访问您的项目中的图像 选择每个图像并打开属性窗口将“生成操作”设置为“资源”和“在存储库中复制”设置为“始终复制”

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

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

于 2019-12-05T19:44:18.563 回答