In manchen Fällen ist es durchaus sinnvoll, XAML dynamisch zu laden. Beispielsweise um wesentlich mehr Möglihckeiten der Veränderung zu bieten. Hier ein kleines Beispiel das zeigt, wie XAML dynamisch geladen werden kann.
Im ersten Schritt wird dazu ein normales WPF Application Projekt angelegt. Daran müssen keine großen Veränderungen vorgenommen werden. Das in Window1 vorgeschlagene Grid habe ich in diesem Beispiel gegen ein StackPanel ausgetauscht. Nun wurde dem Projekt eine Page namens PageToLoad hinzugefügt. In den Eigenschaften wurde die Build Action auf Content gestellt und angegeben, dass diese immer zu kopieren ist, zudem wurde das Codebehing-File gelöscht. Natürlich kann diese Page auch manuell in einem Editor angelegt und später in den Anwendungsordner kopiert werden.
Die Page sieht folgendermaßen aus:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="PageToLoad" Height="108">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" MinHeight="31" />
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Label Grid.Row="0"
Content="Content Loaded dynamically"
FontFamily="Arial"
FontSize="18"
FontWeight="Bold"
HorizontalAlignment="Center"/>
<Button Grid.Row="1"
Margin="81,16,87,0"
Name="PageButton"
Height="35"
VerticalAlignment="Top">
Click Me
</Button>
</Grid>
</Page>
Im nächsten Schritt wird die Codebehind-Datei des Fensters angepasst und sieht insgesamt so aus:
public partial class MainWindow : Window
{
Button _remoteButton;
public MainWindow()
{
InitializeComponent();
LoadXAMLMethod();
}
public void LoadXAMLMethod()
{
try
{
StreamReader sReader =
new StreamReader("PageToLoad.xaml");
DependencyObject doRoot =
XamlReader.Load(sReader.BaseStream)
as DependencyObject;
_remoteButton =
LogicalTreeHelper.FindLogicalNode(doRoot, "PageButton")
as Button;
_remoteButton.Click +=
new RoutedEventHandler(Button_Click);
this.Content = doRoot;
}
catch (FileNotFoundException ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
public void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Call from loaded XAML");
}
}
Nun muss die Anwendung nur noch kompiliert und gestartet werden und schon kann der erste Test erfolgen.
Ein Beispielprojekt kann hier bezogen werden.