0

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

我有一个带有以下 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 应用程序,另一个只是一个类 .dll,其中包含一个名为 Icons 的文件夹,其中包含一个名为 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,并且 icon 变量不为空。

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

我哪里错了?

4

2 回答 2

1

估计同事(伙计们没有通过 SO 的亵渎过滤器 :-)),请注意这一点,以免像我一样浪费数小时的无意义调试:将图标的构建操作设置为RESOURCE

我们有它...

于 2013-09-22T15:40:31.883 回答
0

你缺少属性x:Shared=False

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

希望它能解决你的问题。

于 2013-09-22T15:37:42.113 回答