Wpf 框架、内容、分配操作不起作用?

Wpf 框架、内容、分配操作不起作用?,wpf,Wpf,这里有一个非常简单的复制:启动VS2010或VS2008,新建WPF项目(.NETFramework 3.5SP1),向项目添加一个空页面(Page1.xaml) 其余代码位于MainWindow.xaml.cs中: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); TestFrameContent(); }

这里有一个非常简单的复制:启动VS2010或VS2008,新建WPF项目(.NETFramework 3.5SP1),向项目添加一个空页面(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

对我来说,一个简单的作业会失败,这真是一个谜。有人吗?

请参见

但是,您的帧将永远不会被渲染,因为它不是任何可视树的一部分。下面的示例按预期工作

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>

不幸的是,这不是一个简单的任务。在框架上设置Content属性实际上是调用,这将异步设置内容。您将需要处理该事件,该事件“在找到要导航到的内容时发生,并且可以从content属性获得,尽管它可能尚未完成加载。”


非常感谢。我想在这种情况下,我应该使用ContentControl作为我的FrameworkElemnt容器。请告诉我ContentControl.Content=x是一个简单的赋值:)@sun1991:好吧,它是一个依赖属性赋值,所以我仍然不会称之为“简单”。您可以将双向绑定应用于Content属性,并将更新推送到另一个对象。不过,ContentControl不像Frame那样执行值强制,所以它至少应该像一个简单的属性赋值一样:)。
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()); 
    }
}
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");
    };
}