Frame.Content,赋值操作不起作用?

时间:2010-08-18 11:31:56

标签: wpf

这是一个非常简单的复制品:启动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。

对我来说真是个谜,一个简单的任务就会失败。任何人吗?

2 个答案:

答案 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()); 
    }
}