这是一个非常简单的复制品:启动VS2010或VS2008,新建一个WPF项目(.Net Framework 3.5 sp1),在项目中添加一个空页面(Page1.xaml)。
其余代码在MainWindow.xaml.cs中:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
TestFrameContent();
}
private void TestFrameContent()
{
FrameworkElement fe = Activator.CreateInstance(Type.GetType("WpfFrameContentProblem.Page1")) as FrameworkElement;
Frame frmContainer = new Frame();
frmContainer.Content = fe;
Debug.Assert(frmContainer.Content != null, "Content is null");
}
}
运行应用程序,它将在Debug.Assert上失败,指示frmContainer.Content == null。
对我来说真是个谜,一个简单的任务就会失败。任何人吗?
答案 0 :(得分:3)
不幸的是,这不是一个简单的任务。在Frame上设置Content属性实际上会调用Navigate,它会异步设置内容。您将需要处理Navigated事件,该事件“在找到导航的内容时发生,并且可以从Content属性获得,尽管它可能尚未完成加载。”
private void TestFrameContent()
{
FrameworkElement fe = Activator.CreateInstance(
Type.GetType("WpfFrameContentProblem.Page1")) as FrameworkElement;
Frame frmContainer = new Frame();
frmContainer.Content = fe;
frmContainer.Navigated += delegate(object sender, NavigationEventArgs e)
{
// This will succeed
Debug.Assert(frmContainer.Content != null, "Content is null");
};
}
答案 1 :(得分:0)
请参阅WPF Frame, Content and ContentRendered
然而,您的框架将永远不会被渲染,因为它不是任何视觉树的一部分。下面的示例按预期工作。
XAML:
<Window x:Class="FrameTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel>
<Frame Name="_frame" />
</StackPanel>
</Window>
代码背后:
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
FrameworkElement fe = Activator.CreateInstance(Type.GetType("WpfFrameContentProblem.Page1")) as FrameworkElement;
_frame.Content = fe;
_frame.ContentRendered +=
(sender, e) =>
MessageBox.Show("Type of content = " + (sender as Frame).Content.GetType());
}
}