为什么允许ImageSource作为WPF资源?

Gis*_*shu 6 wpf resources

为什么ResourceDictionary中的这一行不会导致编译错误?

<Window.Resources>
    <ResourceDictionary>
        <ImageSource x:Key="aKey">SomePath</ImageSource>
    </ResourceDictionary>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)

我的理解是,这将导致使用默认ctor创建ImageSource实例.然后设置所有指定的属性.

但是ImageSource是一个抽象类 - 那么为什么这不会导致编译错误?

Ter*_*ver 4

尝试一下 XAML:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <ResourceDictionary>
            <Window x:Key="aKey">BlogHeader.jpg</Window>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Image Source="{StaticResource aKey}"/>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

它编译得很好,但是当你运行它时,你会得到一个运行时 XamlParseException:

无法将属性“Source”中的值转换为“System.Windows.Media.ImageSource”类型的对象。

如果您尝试使用简单类型而不是Window,例如:

public class SomeType
{
}
Run Code Online (Sandbox Code Playgroud)

你会得到一个编译时错误:

元素类型“WpfApplication1.SomeClass”没有关联的 TypeConverter 来解析字符串“BlogHeader.jpg”

所以答案就在于TypeConverter所提供的ImageSourceImageSourceConverter。神奇的事情发生在ImageSourceConverter.ConvertFrom其中,它接受一个字符串,Uri从中创建一个,并使用BitmapFrame.Create它来创建一个BitmapFrame派生自 的ImageSource

请注意,我Window在第一个示例中仅使用从字符串提供类型转换器的类型。