为什么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/

10-12 04:10