为什么ResourceDictionary中的这一行不会导致编译错误?
<Window.Resources>
<ResourceDictionary>
<ImageSource x:Key="aKey">SomePath</ImageSource>
</ResourceDictionary>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)
我的理解是,这将导致使用默认ctor创建ImageSource实例.然后设置所有指定的属性.
但是ImageSource是一个抽象类 - 那么为什么这不会导致编译错误?
尝试一下 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所提供的ImageSource是ImageSourceConverter。神奇的事情发生在ImageSourceConverter.ConvertFrom其中,它接受一个字符串,Uri从中创建一个,并使用BitmapFrame.Create它来创建一个BitmapFrame派生自 的ImageSource。
请注意,我Window在第一个示例中仅使用从字符串提供类型转换器的类型。