我在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
参数。我怎样才能做到这一点?
答案 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();
}
}
用另一个窗口“替换”此窗口:
您是否希望应用程序“主窗口”的实例成为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();
}