2016-09-16 7 views
0

Я выяснил, как получить xaml из файла svg (.svg-> Inkscape-> pdf-> ai-> ExpressionDesign-> xaml) ,Есть ли какой-либо чистый способ использования векторных изображений через URL-адрес пакета в WPF/Xaml

Преобразование дает мне словарь ресурсов с помощью DrawingBrush или Xaml File с холстом.

Теперь я ищу чистый способ использования векторного изображения через URL-адрес пакета, поэтому я могу использовать его в чистом виде из моего ViewModel. Это xaml-фрагмент, который прекрасно работает с ImagePath (string), содержащим URL-адрес пакета, в файл (ресурс) .png. Есть ли что-то подобное для векторных изображений?

// View Model: 
MainMenuEntry.ImagePath = "pack://application:,,,/MyBeautifulApp.Wpf.MainGui;component/CommonResources/OpenFile16x16.png" 

// .Xaml File 
<DataTemplate> 
    <Button Command ="{Binding ClickCommand}" Margin="3,0,0,0"> 
     <Button.Template> 
      <ControlTemplate> 
       <Image Source="{Binding ImagePath}" Width="16" Height="16" Stretch="Uniform" VerticalAlignment="Center" /> 
      </ControlTemplate> 
     </Button.Template> 
    </Button> 
</DataTemplate> 

Единственный способ я нашел, что это будет работать вообще было с зывание ImageSource к StaticResource с DrawingBrush (в ResourceDictionary), но это не помогает мне с моделью зрения, где я мог бы имеют либо растровый файл, либо векторное изображение. Должен быть какой-либо разумный способ обработки векторных изображений, например, с помощью svg в html?

+0

Не уверен, что вы подразумеваете под «чистым» способом. То, как я это делаю, - AI -> [XAML Conversion] (http://www.mikeswanson.com/xamlexport/) -> Ресурс. Если это единственный путь, я просто создаю шаблон стиля. Если он несколько, я использую метод [другой шаблон] (http://stackoverflow.com/questions/13292179/best-way-to-use-a-vector-image-in-wpf/13293017#13293017). Затем все это находится в ресурсном словаре и вызывается через StaticResource, будь то из XAML или codebehind, работает как шарм. –

+0

С чистым я подразумевал прямое, как псевдокод "pack: // application: ,,, MyBeautifulApp.Wpf.MainGui; component/CommonResources/OpenFileVectorGraphic.xaml", который я мог бы связывать так же, как и png. Угадайте, что теперь я сделаю класс MenuItemCommand для модели с несколькими свойствами для битовой карты/векторного значка или с помощью свойства объекта и стиля/шаблона, который динамически создает соответствующие элементы в зависимости от типа, возвращаемого этим свойством (строка маршрута pack/xaml). –

+0

Ах, если вы действительно хотите использовать Image.Source, вы можете перенести свой XAML-вектор в ресурс DrawingImage и по-прежнему сможете выполнять '' –

ответ

-1

Для организационных целей создайте отдельный проект библиотеки классов для ваших активов. Определите XAML векторной графики в ResourceDictionary

Assets/Категория/My-asset.xaml:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    mc:Ignorable="d"> 
<VisualBrush x:Key="my-asset" Stretch="Uniform"> 
    <VisualBrush.Visual> 
     <Canvas Width="48.822" Height="53.243"> 
       <Path {...} /> 
      </Canvas> 
     </VisualBrush.Visual> 
    </VisualBrush> 
</ResourceDictionary> 

Определить ResourceDictionary, который содержит ссылку на все ваши активы:

активы/активы. XAML

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" > 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="Category/my-asset.xaml" /> 
     {...} 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

В вашей App.xaml загрузить Assets.xaml

<Application x:Class="MyApp.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="pack://application:,,,/ClientAssets;component/Assets/Assets.xaml" /> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

С помощью этого места вы можете использовать свою графику, где бы вы ни хотели, как кисть в прямоугольнике.

<Rectangle Grid.Row="2" Fill="{StaticResource my-asset}" Height="16" Width="16" />