Loading vector graphics from XAML files programmatically in a WPF application
Asked Answered
V

1

12

I would like to load vector graphics stored as XAML files (separate files, not in a dictionary), embedded in my application, and I have a few questions to do so:

  1. XAML looks a bit ambiguous, since it can be used to represent either static resources like vector images, or interfaces which are being dynamically built like the ones in WPF. Because of this, the format of a XAML vector image is unclear to me : what should be the root element, like the "svg" tag for svg vector images ? Currently, I'm using a Canvas as the top element since I want to plot my graphics in another Canvas.

  2. What is the best method to load those file programmatically (I mean, to create the Canvas from the xaml files) ? I've seen (and tried) different solutions with XamlReader, but nothing worked: the app crashes and the debugger does not help (most problems I've encountered seem to occur during the parsing, and the error message was unclear).

I've read http://learnwpf.com/post/2006/06/04/How-do-I-Include-Vector-Based-Image-Resources-in-my-WPF-Application.aspx, but the link to the article dealing with resource files loading is dead, and the images are not created using C# code.

Vegetation answered 1/5, 2012 at 22:35 Comment(1)
It's great that you have found the solution and shared with everyone, it will be more helpful if you can add the solution as an answer and accept it as Answer, instead of adding it in the question.Wherein
V
8

Okay, I found the solution by myself and here it is :

My project is named "Editor", and I've placed the XAML file I want to read in a "Graphics" folder. This file is named "Image.xaml". The project tree looks like this :

enter image description here

The XAML file itself holds this code :

<Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        Width="40" Height="40">
    <Rectangle Canvas.Left="0" Canvas.Top="0" Fill="White" Stroke="Black" StrokeThickness="1" Height="40" Width="40" />
    <!-- ... -->
</Canvas>

(the xaml namespace 'xmlns' reference is needed)

The code used to load the file is :

StreamResourceInfo sr = Application.GetResourceStream(new Uri("Editor;component/Graphics/Image.xaml", UriKind.Relative));
Canvas result = (Canvas)XamlReader.Load(new XmlTextReader(sr.Stream));
layoutRoot.Children.Add(result);

'layoutRoot' being the name of the main Canvas of my application.

Last subtility : the property 'BuildAction' of the *.xaml file must be set to 'Resource', or you will encounter a XamlParseException with hexadecimal value 0x0C (to change this property, right-click on the file in the project treeview).

Hope this can help.

Vegetation answered 14/7, 2012 at 21:36 Comment(1)
What code do you use in the MainWindow.xaml, to reference the C#?Twana

© 2022 - 2024 — McMap. All rights reserved.