2014-02-05 6 views
2

Я пытаюсь показать свое векторное изображение в Image.Source с XamlReader. У меня есть такой ресурс XAML.WPF Использование источника изображения XAML

<Canvas Width="76" Height="76" ClipToBounds="True" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
<Path Fill="#FF000000" Height="76" Stretch="Fill" Width="76"> 
    <Path.Data> 
     <PathGeometry FillRule="Nonzero" Figures="M21,30.0001L55.9999,30.0001 55.9999,50 21,50 21,30.0001z M52,28L37,28C38,25,39.4999,24.0001,39.4999,24.0001L50.75,24C51.3023,24,52,24.6977,52,25.25L52,28z" /> 
    </Path.Data> 
</Path> 

Создано связывание с here. Но это не работает, когда я пытаюсь использовать его: собственность

<Image Stretch="Fill" Source="{Binding Converter={StaticResource uriToUIElementConverter},ConverterParameter=images/Folder.xaml}"/> 

самого файла Build Action=Resource. Преобразователь uriTOUIElementConverter является то, что:

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(); 
    } 
} 

Когда я пытаюсь построить проект дает мне эти ошибки:

System.IO.FileNotFoundException 

Я редактировал конвертер вроде этого:

Stream fileStream = Application.GetResourceStream(new Uri("pack://application:,,,/ASSEMBLYNAME;component/"+(string) parameter)).Stream; 

Но это не работает еще раз. Что я должен сделать, чтобы это сработало?

ответ

4

Путь, который вам необходимо предоставить, Application.GetResourceStream относится к пакетному приложению.

Пример:

У меня есть XAML файлов изображений/Folder.xaml. Build Action for Folder.xaml - это ресурс.

Folder.xaml

<DrawingImage xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
    <DrawingImage.Drawing> 
     <GeometryDrawing Brush="LimeGreen"> 
      <GeometryDrawing.Geometry> 

       <PathGeometry FillRule="Nonzero" 
           Figures="M21,30.0001L55.9999,30.0001 55.9999,50 21,50 21,30.0001z M52,28L37,28C38,25,39.4999,24.0001,39.4999,24.0001L50.75,24C51.3023,24,52,24.6977,52,25.25L52,28z" /> 

      </GeometryDrawing.Geometry> 
     </GeometryDrawing> 
    </DrawingImage.Drawing> 
</DrawingImage> 

Преобразователь:

public class FileToUIElementConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string path = parameter.ToString(); 

     StreamResourceInfo sri = Application.GetResourceStream(new Uri(path, UriKind.Relative)); 
     if (sri != null) 
     { 
      using (Stream stream = sri.Stream) 
      { 
       var logo = XamlReader.Load(stream) as DrawingImage; 

       if (logo != null) 
       { 
        return logo; 
       } 
      } 
     } 

     throw new Exception("Resource not found"); 
    } 

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

Использование:

<Image x:Name="ImageLogo" Source="{Binding Converter={StaticResource FileToUiElementConverter}, ConverterParameter=images/folder.xaml}"/> 
Смежные вопросы