类库中的资源字典中的图标未显示在主应用程序窗口中

时间:2013-09-22 13:54:14

标签: wpf resourcedictionary

编辑: 我创建了一个更容易概念的证明:

我有一个带有以下MainWindow.xaml的WPF应用程序:

<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
    <Image Source="pack://application:,,,/IconContainer;component/Icons/Blocked.png"/>
</Grid>

在我的测试解决方案中,我只有两个项目:一个是上面的WPF应用程序,另一个是带有名为Icons的文件夹的类.dll,其中有一个名为Blocked.png的文件。 WPF应用程序引用类库。

网格中没有显示任何内容。

结束编辑

在我的解决方案中,我有一个带有ListView的WPF应用程序,它在其中一列中显示一个图标。起初我在WPF应用程序中直接使用ResourceDictionary引用了这些图标,一切都很顺利。现在我正在尝试将图标移动到类库中,一切都在崩溃。

App.xaml:

<Application x:Class="Application"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters="clr-namespace:WPFBase;assembly=WPFBase" 
xmlns:local="clr-namespace:DataEditor"
xmlns:styles="clr-namespace:Styles;assembly=Styles"
StartupUri="MainWindow.xaml">
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/Styles;component/Styles/BridgeItStyles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        <styles:IconConverter x:Key="IconConverter"/>
    </ResourceDictionary>
</Application.Resources>

MainWindow.xaml:

 <GridViewColumn.CellTemplate>
    <DataTemplate>
       <Image Source="{Binding IconName, 
              Converter={StaticResource IconConverter},ConverterParameter=S}"
       />
    </DataTemplate>
 </GridViewColumn.CellTemplate>

Styles类库包含一个包含应用程序样式的ResourceDictionary,但它还包含一个转换器,用于构造应检索的图标的文件名。此转换器使用自己的ResourceDictionary,其中包含对图标的引用。

指定图标的ResourceDictionary:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <BitmapImage x:Key="ErrorL" UriSource="errorL.png"/>
    <BitmapImage x:Key="InfoL" UriSource="infoL.png"/>
    <BitmapImage x:Key="QuestionL" UriSource="questionL.png"/>
    <BitmapImage x:Key="SuccessL" UriSource="successL.png"/>
    <BitmapImage x:Key="WarnL" UriSource="warnL.png"/>
    <BitmapImage x:Key="ErrorS" UriSource="errorS.png"/>
    <BitmapImage x:Key="ErrorXS" UriSource="errorXS.png"/>
    <BitmapImage x:Key="InfoS"  UriSource="infoS.png"/>
    <BitmapImage x:Key="QuestionS" UriSource="questionS.png"/>
    <BitmapImage x:Key="SuccessS" UriSource="successS.png"/>
    <BitmapImage x:Key="WarnS" UriSource="warnS.png"/>
</ResourceDictionary>

转换器,也在Styles类库中:

Public Class IconConverter
    Implements IValueConverter

    Private _iconDictionary As ResourceDictionary

    Public Sub New()
        _iconDictionary = New ResourceDictionary()
        _iconDictionary.Source = New Uri("/Styles;component/MessageIcons/MessageIcons.xaml", UriKind.Relative)
    End Sub

    Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.Convert
        Dim iconName = CStr(value)
        Dim sizeParameter = CStr(parameter)
        Dim icon As BitmapImage
        Select Case iconName
            Case ProgressReport(Of Object).IconError
                Return _iconDictionary(ProgressReport(Of Object).IconError & sizeParameter)
            Case ProgressReport(Of Object).IconInfo
                icon = _iconDictionary(ProgressReport(Of Object).IconInfo & sizeParameter)
            Case ProgressReport(Of Object).IconSuccess
                Return _iconDictionary(ProgressReport(Of Object).IconSuccess & sizeParameter)
            Case ProgressReport(Of Object).IconWarn
                Return _iconDictionary(ProgressReport(Of Object).IconWarn & sizeParameter)
            Case Else
                Return Binding.DoNothing
        End Select

        Return icon
    End Function

    Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
        Return Binding.DoNothing
    End Function
End Class

当我在转换器中设置断点时,我可以看到构造了正确的URI并且图标变量不为空。

尽管如此,在用户界面中没有显示任何内容,并且Visual Studio的立即窗口中没有显示绑定或其他错误。

我哪里错了?

2 个答案:

答案 0 :(得分:1)

估计同事(g.u.y.s.没有通过SO的亵渎过滤器:-)),请注意这一点,以免你像我一样失去数小时毫无意义的调试: 将图标的构建操作设置为 RESOURCE

我们有它......

答案 1 :(得分:0)

你错过了属性x:Shared=False

 <BitmapImage x:Key="ErrorL" x:Shared="False" UriSource="errorL.png"/> 

希望它能解决你的问题。