Использование файла XAML в качестве источника векторного изображения

Я хотел бы иметь возможность использовать векторную графику, предпочтительно определенную в XAML, в качестве источника элемента управления изображением, точно так же, как в настоящее время я могу использовать растровое изображение, например PNG. Таким образом, я мог легко смешивать и сопоставлять растровые и векторные изображения, например так:

<StackPanel>
    <Image Source="Images/Namespace.png"/>
    <Image Source="Images/Module.xaml"/>
</StackPanel>

Module.xaml, скорее всего,<DrawingImage> как его корневой элемент вместо<UserControl>.

На самом деле то, что я действительно хочу, это то, чтобы моя ViewModel могла выбирать либо растровое, либо векторное изображение по своему усмотрению:

<Image Source="{Binding ImageUri}"/>

Это возможно? Может ли Image.Source загружать классы XAML из заданного URI? Или он может загружать только растровые ресурсы?

 Jacques25 апр. 2014 г., 11:37
Заставляет меня задуматься ... Почему использование изображения XAML в WPF / Silverlight так сложно или не поддерживается изначально ... учитывая, что WPF / Silverlight основан на XAML!

Ответы на вопрос(3)

1) Добавьте DrawingImage. Action = Content». и «Копировать всегда». Или же вы можете динамически загружать XAML извне, так как логика, которую я собираюсь объяснить, будет работать и для Lous-XAML.

2) Написать конвертер для преобразования URI XAML в UIELement, в вашем случае это всегда будет DrawingImage

public class FileToUIElementConverter :IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        FileStream fileStream = new FileStream((string)parameter, FileMode.Open); 
        return XamlReader.Load(fileStream) as DrawingImage;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

3) Напишите XAML, как показано ниже

<Window.Resources>
    <local:FileToUIElementConverter x:Key="uriToUIElementConverter"/>
</Window.Resources>
<Grid>
    <Image Stretch="Fill" Source="{Binding Converter={StaticResource uriToUIElementConverter},ConverterParameter=ImageDrawing.xaml}"/>
</Grid>
 10 июл. 2009 г., 20:47
Я попробовал вышеупомянутый способ, и он работал хорошо.
 Joe White10 июл. 2009 г., 14:37
Я не думаю, что FileStream может загружаться из скомпилированного ресурса (pack: // URI), не так ли?
 25 мая 2014 г., 20:12
Здесь есть конвертер, который обрабатывает ресурсы:stackoverflow.com/a/21588195/418362

es:

<Image Source="{StaticResource MyImage}" />

Сохраните изображения в ResourceDictionary как DrawImage. Expression Blend может помочь вам создать этот материал:

<ResourceDictionary
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

   <DrawingImage x:Key="MyImage">
      <DrawingImage.Drawing>
         <DrawingGroup>
            <DrawingGroup.Children>
               <GeometryDrawing Brush="Black" Geometry="M 333.393,... 100.327 Z "/>
               <GeometryDrawing Brush="Black" Geometry="F1 M 202.309,... Z "/>
                      :
            </DrawingGroup.Children>
         </DrawingGroup>
     </DrawingImage.Drawing>
   </DrawingImage>

</ResourceDictionary>
 Joe White10 июл. 2009 г., 14:39
Конечно. Тем не менее, это не помогает мне в сценарии привязки данных (по крайней мере, не напрямую).
 21 сент. 2018 г., 09:27
Простой, но элегантный способ в сочетании с «Методом 3» обсуждалось вthis blog post

тдельный файл, и на него можно напрямую ссылаться через URI, как в исходном примере - НО URI нетривиален. Вы должны выяснить, Microsoft's pack Синтаксис URI и использовать его.

 24 авг. 2015 г., 22:42
Это не задокументировано, но "пакет" Внутренние URI не загружаются в память доafter Вы создаете свой первый UIElement. Таким образом, попытка использовать его в App.cs (до того, как ваш MainWindow.xaml даже был загружен) довольно неприятна. Вместо этого используйте его в вашем обработчике MainWindow_Load.

Ваш ответ на вопрос