C# - 在运行时加载xaml文件

时间:2013-03-20 19:19:18

标签: c# wpf xaml runtime

我在C#中有一个WPF应用程序。

我有一个MainWindow类,它继承自System.Windows.Window类。

接下来,我的磁盘上有一个xaml文件,我想在运行时加载:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="I want to load this xaml file">
</Window>

如何在运行时加载该xaml文件?换句话说,我希望我的MainWindow类完全使用上面提到的xaml文件,所以我想要使用MainWindow的方法AddChild,因为它将一个子项添加到窗口,但是我想替换那个Window参数。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:3)

WPF应用程序在VS模板中默认具有StartupUri参数:

<Application x:Class="WpfApplication2.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         StartupUri="MainWindow.xaml">
</Application>

WPF框架将使用此uri使用XamlReader 实例化窗口类,并显示。在您的情况下 - 从App.xaml中删除此StartUpUri并手动实例化该类,以便您可以在从xaml加载其他窗口时隐藏它。

现在将此代码添加到App.xaml.cs

 public partial class App : Application
 {
    Window mainWindow; // the instance of your main window

    protected override void OnStartup(StartupEventArgs e)
    {
        mainWindow = new MainWindow();
        mainWindow.Show();
    }
 }

用另一个窗口“替换”此窗口:

  • 使用mainWindow.Hide();
  • 隐藏此窗口
  • 使用XamlReader读取您的personal.xaml,它为您提供已加载的Xaml的Window实例。
  • 将其分配给mainWindow(如果需要)并调用Show()以显示它。

您是否希望应用程序“主窗口”的实例成为App实例的成员,这当然是您的选择。

总之,整个技巧是:

  • 隐藏主窗口
  • 加载您的窗口实例
  • 显示您的窗口实例

答案 1 :(得分:0)

简短回答: - 不,您不能在Window替换 Window。在Window派生的对象中没有任何内容可以访问“嘿,用其他窗口替换所有内容

更长的回答: - 但是,你可以做一些像这样愚蠢的事情:

private void ChangeXaml()
{
    var reader = new StringReader(xamlToReplaceStuffWith);
    var xmlReader = XmlReader.Create(reader);
    var newWindow = XamlReader.Load(xmlReader) as Window;    
    newWindow.Show();
    foreach(var prop in typeof(Window).GetProperties())
    {
        if(prop.CanWrite)
        {
            try 
            {
                // A bunch of these will fail. a bunch.
                Console.WriteLine("Setting prop:{0}", prop.Name);
                prop.SetValue(this, prop.GetValue(newWindow, null), null);
            } catch
            {
            }
        }
    }
    newWindow.Close();
    this.InvalidateVisual();
}