在我的测试中,我创建了一个像这样的简单类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
namespace Test
{
public class MyCustomWindow: Window
{
}
}
这个类被编译成一个dll。在另一个项目中,我尝试使用这个自定义窗口,如下所示:
<Custom:MyCustomWindow x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Custom="clr-namespace:Test;assembly=Test"
Title="MainWindow" Height="600" Width="1210" WindowState="Maximized" >
<Grid Background="Blue">
<Button Content="Button" HorizontalAlignment="Left" Margin="457,212,0,0" VerticalAlignment="Top" Width="75"/>
</Grid>
这个东西编译没有错误,当自定义窗口由 App.xaml 文件中的“StartupUri”打开时效果很好(定义了第一个加载的窗口)。
但是,如果我将其他窗口设置为在 StartupUri 中加载,并且:
MainWindow m = new MainWindow();
m.Activate();
m.Show();
this.Close();
CustomWindow 将打开,但没有任何内容,没有按钮和蓝色网格 - 甚至没有标题。
任何解决方法?我需要做什么才能打开一个与 StartupUri 行为相同的窗口?
编辑:
我注意到 MainWindow(或从 MyCustomWindow 派生的任何窗口)根本不能在构造函数中使用 InitializeComponent() 方法,因为它在上下文中不存在。奇怪的是,当使用 StartupUri 时,没有这个,内容是正常加载的。
编辑2:
我认为问题正在发生,因为我无法将 InitializeComponent() 方法放在 MyCustomWindow 中。这就解释了为什么 MainWindow 可以正常加载到 StartupUri 中:它是直接从 xaml 文件加载的,因此无需 InitializeComponent 即可解析内容。
我开始考虑实现 IComponentConnector 接口,但我不知道该怎么做。
编辑3:
文件 MainWindow.xaml.cs 的代码隐藏是:
using Test;
namespace TestingCustomWindow
{
public partial class MainWindow : MyCustomWindow
{
public MainWindow()
{
// Cannot use InitializeComponent here
}
}
}