问题描述
我们正在迁移到 Winforms 到基于 WPF 的解决方案.我们有自定义的 XML 定义,用于在运行时构建 windows 窗体.
We are migrating to Winforms to WPF based solution. We have custom XML definition which are used to build the windows form at runtime.
由于 XAML 是基于 XML 的,我们是否可以使用 XAML 定义定义一个 HelloWorldWindow.xml 文件,并且可以将它加载到 WPF 应用程序中,而无需在 CSharp 文件背后有任何代码?我们将在运行时附加钩子背后的代码.
Since XAML is XML based, can we define a HelloWorldWindow.xml file with XAML definition and can it be loaded into the WPF app without any code behind CSharp files? We will attach the code behind hook at runtime.
如何在运行时附加后面的代码?
How to attach the code behind at runtime?
推荐答案
使用此 XAML 创建 XML 文件 Tempwin.xml
Create an XML file Tempwin.xml using this XAML
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300" Background="Transparent" >
<Border Background="Black" CornerRadius="10" BorderThickness="4" BorderBrush="RoyalBlue">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Text="Sample Text" Foreground="White" Margin="2"></TextBlock>
<TextBox Grid.Row="1" Margin="5"> </TextBox>
<TextBlock Text="Sample Text 1" Grid.Row="2" Foreground="White" Margin="2"></TextBlock>
<TextBox Grid.Row="3" Margin="5"></TextBox>
<Ellipse Fill="Red" Height="100" Width="100" Grid.Row="4" Margin="0,10,0,0"></Ellipse>
</Grid>
</Border>
使用以下 xaml 创建示例 WPF 应用程序
Create a sample WPF Application with the below xaml
<Window x:Class="WpfApplication12.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="600" Width="600">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Height="25" Width="100" Margin="2" Click="Button_Click"> Show Content</Button>
<Grid x:Name="content" Grid.Row="1" Margin="2">
</Grid>
</Grid>
将下面的 C# 代码粘贴到 Button_Click 后面的代码中
Paste the below C# code in codebehind the Button_Click
StreamReader mysr = new StreamReader(@"D:Tempwin.xml");
FrameworkElement rootObject = XamlReader.Load(mysr.BaseStream) as FrameworkElement;
content.Children.Add(rootObject);
如果你想在运行时加载 xaml,你不能在你的 XAML 文件后面提供任何代码.所以我在创建 xml 之前删除了 x:Class 属性
if you want to load xaml at runtime you cannot give any code behind your XAML file. So i have removed the x:Class attribute before creating the xml
事件挂钩....
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300" Background="Transparent" >
<Border Background="Black" CornerRadius="10" BorderThickness="4" BorderBrush="RoyalBlue">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Text="Sample Text" Foreground="White" Margin="2"></TextBlock>
<TextBox Grid.Row="1" Margin="5"> </TextBox>
<TextBlock Text="Sample Text 1" Grid.Row="2" Foreground="White" Margin="2"></TextBlock>
<TextBox Grid.Row="3" Margin="5"></TextBox>
<Ellipse Fill="Red" Height="100" Width="100" Grid.Row="4" Margin="0,10,0,0"></Ellipse>
<Button Grid.Row="5" Height="25" Content="Event added at Runtime" x:Name="btnTest"></Button>
</Grid>
</Border>
Button ButtoninXAML;
private void Button_Click(object sender, RoutedEventArgs e)
{
StreamReader mysr = new StreamReader(@"D:Tempwin.xml");
FrameworkElement rootObject = XamlReader.Load(mysr.BaseStream) as FrameworkElement;
ButtoninXAML = LogicalTreeHelper.FindLogicalNode(rootObject, "btnTest") as Button;
ButtoninXAML.Click += new RoutedEventHandler(Button_Click1);
content.Children.Add(rootObject);
}
private void Button_Click1(object sender, RoutedEventArgs e)
{
MessageBox.Show("Added At Runtime");
}
这篇关于通过运行时加载 XAML XML?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!