WPF UserControls:即使使用'x:Shared ="False"',图像也会消失

Han*_*ish 6 wpf resources xaml user-controls image

我在一个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>
Run Code Online (Sandbox Code Playgroud)

图像源ResourceDictionary在同一个程序集中的另一个中定义,并标记为x:Shared="False":

<BitmapImage x:Key="IconoDashboardBlanco" x:Shared="False"
UriSource="pack://application:,,,/QualityFramework;component/Images/dashboard64X64.png"/>
Run Code Online (Sandbox Code Playgroud)

由于样式将用于不同的程序集,我使用"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)
Run Code Online (Sandbox Code Playgroud)

问题:

我打开UserControl A包含图像的按钮,图像显示确定.然后我打开UserControl B包含一个相同的按钮,图像确定.我UserControl A再次打开,图像消失了.如果我打开UserControl B则发生相同的情况,然后UserControl A,最后一个"拥有"图像.

我到处走,所有的解决方案都指向了x:Shared="False",URI notation而且Build Action...我应用了所有这些,问题仍然存在.我也尝试过清洁和重建但没有成功.

我错过了什么?谢谢!

PS:如果我将两个按钮的内容直接设置到图像上,它可以正常工作,但整个造型点就是避免这样做!

XAM*_*eLi 11

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

简单但不是WPF x:Shared="False"风格的解决方案正在设定风格.

正确的方法是使用ControlTemplateDataTemplate.

根据你的观察:

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

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