Использование файла XAML в качестве источника векторного изображения - PullRequest
17 голосов
/ 10 июля 2009

Я хотел бы иметь возможность использовать векторную графику, предпочтительно определенную в 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? Или он может загружать только растровые ресурсы?

Ответы [ 3 ]

13 голосов
/ 10 июля 2009

Вы можете просто ссылаться на векторную графику как StaticResources:

<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>
2 голосов
/ 10 июля 2009

1) Добавьте DrawingImage.xaml в проект и установите для его свойств «BuildAction = Content» и «Copy Always». В противном случае вы можете динамически загружать XAML извне, так как логика, которую я собираюсь объяснить, будет работать и дляoose-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>
1 голос
/ 16 октября 2009

Вставить ресурс XAML (DrawingImage) с типом «Ресурс». Тогда это не отдельный файл, и на него можно напрямую ссылаться через URI, как в исходном примере - НО URI нетривиален. Вы должны выяснить синтаксис URI "pack" от Microsoft и использовать его.

...