2

我在 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参数。我怎样才能做到这一点?

4

2 回答 2

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() 来显示它。

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

总之,整个技巧是:

  • 隐藏主窗口
  • 加载你的窗口实例
  • 显示你的窗口实例
于 2013-03-22T16:11:39.703 回答
0

简短回答: - 不,您不能. 在 -derived 对象中没有任何内容可以访问,该对象显示“嘿,用这个其他窗口替换所有内容”WindowWindowWindow

更长的答案:-但是,您可以做一些愚蠢的事情:

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();
}
于 2013-03-22T17:13:43.153 回答