Der Beitrag beschreibt, wie mit Hilfe von XamlReader.Load Silverlight-Objekte dynamisch aus XML (Xaml) erstellt werden können.
Es gibt zahlreiche Gründe, Silverlight-Objekte dynamisch zu erstellen. Unter anderem gewinnst Du viel Flexibilität für Deine Anwendung.
InitializeFromXaml, XamlReader, XamlWriter sind die üblichen Verdächtigen, wenn es um das dynamische Erzeugen von Objekten aus XML geht.
InitializeFromXaml wurde schon in der Beta-Phase abgeschafft, XamlWriter gibt es nur in der WPF und übrig bleibt der XamlReader.
Um die Verwendung zu testen habe ich ein kleines Programm geschrieben - Du kannst (zusätzliche) Buttons hinzufügen - und auch wieder entfernen:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Net;
5 using System.Windows;
6 using System.Windows.Controls;
7 using System.Windows.Documents;
8 using System.Windows.Input;
9 using System.Windows.Media;
10 using System.Windows.Media.Animation;
11 using System.Windows.Shapes;
12 using System.Windows.Markup;
13
14 namespace FromXaml
15 {
16 public partial class Page : UserControl
17 {
18 public Page()
19 {
20 InitializeComponent();
21 }
22
23 static int nr = 0;
24 private void OnCreateRectangle(object sender, RoutedEventArgs e)
25 {
26 string s;
27 s = "<Rectangle Fill=\"#FFFF0000\" Name=\"_rectangle1\" Width=\"20\" Height=\"20\" " +
28 "Grid.Row=\"1\" " +
29 "xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" />";
30 //+"<Ellipse Width=\"30\" Height=\"30\" Fill=\"Red\"></Ellipse>"
31 UIElement o =
32 (UIElement)XamlReader.Load(s);
33 ((Grid)LayoutRoot).Children.Add(o);
34 ((Button)e.OriginalSource).IsEnabled = false;
35 }
36
37 private void OnCreateButton(object sender, RoutedEventArgs e)
38 {
39 string s = "<Button Width=\"100\" " +
40 "Grid.Row=\"2\" " +
41 "Height=\"25\" Content=\"Xaml Button " + nr++.ToString() + "\" Margin=\"5\" " +
42 " xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" />" ;
43 UIElement o =
44 (UIElement)XamlReader.Load(s);
45 spBtn.Children.Add(o);
46 ((Button)o).Click += new RoutedEventHandler(OnNewButtonClick);
47 }
48
49 void OnNewButtonClick(object sender, RoutedEventArgs e)
50 {
51 spBtn.Children.Remove((UIElement) e.OriginalSource);
52 }
53 }
54 }
Achte auf den Namespace in den Zeilen 29 und 42. XamlReader.Load ist auf den Namespace angewiesen.
Das zugehörige Xaml:
<UserControl x:Class="FromXaml.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.RowDefinitions >
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" >
<Button Width="100" Click="OnCreateRectangle"
Height="25" Content="Create Rectangle"
Margin="5">
</Button>
<Button Width="100" Click="OnCreateButton"
Height="25" Content="Create Button"
Margin="5">
</Button>
</StackPanel>
<ScrollViewer Grid.Row="2">
<StackPanel x:Name="spBtn"
Orientation="Vertical">
</StackPanel></ScrollViewer>
</Grid>
</UserControl>