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