2012-05-01 17 views
12

Chciałbym załadować grafiki wektorowe przechowywane jako pliki XAML (osobne pliki, nie w słowniku), osadzone w mojej aplikacji i mam do tego kilka pytań:Ładowanie grafiki wektorowej z plików XAML programowo w aplikacji WPF

  1. XAML wygląda nieco dwuznaczny, ponieważ może być używany do reprezentowania zarówno statyczne jak zasoby obrazów wektorowych lub interfejsów, które są dynamicznie budowanych jak te w WPF. Z tego powodu format obrazu wektorowego XAML jest dla mnie niejasny: jaki powinien być element główny, na przykład znacznik "svg" dla obrazów wektorowych svg? Obecnie używam Canvas jako głównego elementu, ponieważ chcę wydrukować moją grafikę w innym płótnie.

  2. Jaka jest najlepsza metoda załadowania tych plików programowo (to znaczy, aby utworzyć Canvas z plików xaml)? Widziałem (i próbowałem) różne rozwiązania z XamlReaderem, ale nic nie działało: aplikacja się zawiesza i debugger nie pomaga (większość problemów, które napotkałem, zdaje się występować podczas analizowania, a komunikat o błędzie był niejasny).

Czytałem http://learnwpf.com/post/2006/06/04/How-do-I-Include-Vector-Based-Image-Resources-in-my-WPF-Application.aspx, ale link do artykułu zawierającego pliki zasobów załadunku jest martwy, a obrazy nie są tworzone przy użyciu kodu C#.

+12

To świetnie, że znalazłeś rozwiązanie i udostępniono je wszystkim, będzie bardziej pomocne, jeśli możesz dodać rozwiązanie jako odpowiedź i zaakceptować jako odpowiedź, zamiast dodawać je do pytania. – akjoshi

Odpowiedz

8

Dobra, znalazłem rozwiązanie przeze mnie i tutaj jest:

Mój projekt nosi nazwę „Edytor”, a ja umieścić plik XAML chcę czytać w folderze „grafika”. Ten plik ma nazwę "Image.xaml". drzewo Projekt wygląda następująco:

enter image description here

Sam plik XAML posiada ten kod:

<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> 

(potrzebne jest odniesienie przestrzeni nazw XAML 'xmlns')

kod używany aby załadować plik:

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" to nazwa głównego obszaru roboczego mojej aplikacji.

Ostatni subtility: właściwość „BuildAction” z * .xaml pliku musi być ustawiony na „zasób”, czy będzie można spotkać XamlParseException o wartości szesnastkowej 0x0C (aby zmienić tę właściwość, kliknij prawym przyciskiem myszy na plik w podgląd drzewa projektu).

Mam nadzieję, że to pomoże.

+0

Jakiego kodu używasz w MainWindow.xaml, aby odwołać się do C#? – Hoby

Powiązane problemy