为什么ResourceDictionary中的这一行不会导致编译错误?
<Window.Resources>
<ResourceDictionary>
<ImageSource x:Key="aKey">SomePath</ImageSource>
</ResourceDictionary>
</Window.Resources>
我的理解是,这将导致使用默认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>
它可以很好地编译,但是当您运行它时,会得到一个运行时XamlParseException:
无法将属性“源”中的值转换为类型“System.Windows.Media.ImageSource”的对象。
例如,如果尝试使用简单类型而不是
Window
:public class SomeType
{
}
您将得到一个编译时错误:
元素类型“WpfApplication1.SomeClass”没有关联的TypeConverter来解析字符串“BlogHeader.jpg”
因此答案就在于
TypeConverter
提供的ImageSource
提供的ImageSourceConverter
。魔术发生在ImageSourceConverter.ConvertFrom
中,该Uri
接受一个字符串,从中创建一个BitmapFrame.Create
,然后使用BitmapFrame
创建一个从ImageSource
派生的Window
。请注意,在第一个示例中,我仅使用ojit_code来使用从字符串提供类型转换器的类型。
关于wpf - 为什么允许ImageSource作为WPF资源?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4116831/