Почему ImageSource разрешен в качестве ресурса WPF? - PullRequest
6 голосов
/ 07 ноября 2010

Почему эта строка в ResourceDictionary не приводит к ошибке компиляции?

<Window.Resources>
    <ResourceDictionary>
        <ImageSource x:Key="aKey">SomePath</ImageSource>
    </ResourceDictionary>
</Window.Resources>

Насколько я понимаю, это приведет к созданию экземпляра ImageSource с использованием ctor по умолчанию. После этого будут установлены все указанные свойства.

Однако ImageSource является абстрактным классом - почему же это не приводит к ошибке компиляции?

1 Ответ

4 голосов
/ 08 ноября 2010

Попробуйте этот бит 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:

Невозможно преобразовать значение в атрибуте 'Source' в объект типа 'System.Windows.Media.ImageSource'.

Если вы попытаетесь использовать простой тип вместо Window, например:

public class SomeType
{
}

Вы получите ошибку во время компиляции:

Тип элемента 'WpfApplication1.SomeClass' не имеет связанного TypeConverter для анализа строки 'BlogHeader.jpg'

Таким образом, ответ лежит в TypeConverter, предоставленном ImageSource, который ImageSourceConverter. Магия происходит в ImageSourceConverter.ConvertFrom, которая берет строку, создает из нее Uri и использует BitmapFrame.Create для создания BitmapFrame, полученного из ImageSource.

Обратите внимание, что я использовал Window в первом примере только для использования типа, который предоставляет преобразователь типа из строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...