我正在wpf和c#中创建一个简单的联系人应用程序。最初,我想要的内容看起来很简单,但是我已经尝试过在某些页面之间进行导航,但是没有用。我可以从窗口切换页面,但是,当我进入其中一个页面并尝试加载另一个页面时,什么也没有发生。
private void BtnEditarContato_Click(object sender, RoutedEventArgs e)
{
try
{
Contato c = new Contato();
c = (Contato)DgContato.SelectedItem;
Page_Contato_Fisica p = new Page_Contato_Fisica(true, c);
ViewContatoFisico v = new ViewContatoFisico();
v.FrameContatoFisico.Content = p;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
我正在从DataGrid的记录中获取数据,正在加载模板类并将该类传递到另一个窗口以加载字段并进行更改,但是我无法进行此导航。
有人知道如何解决吗?
答案 0 :(得分:0)
您需要执行 .show()之类的操作。
如果 Page_Contato_Fisica 是以下形式:
Page_Contato_Fisica p = new Page_Contato_Fisica(true, c);
p.show();
答案 1 :(得分:0)
当您说“将该类传递到另一个窗口”时。 如果该窗口已经打开,那么您必须去查找对该窗口的引用。 然后,您会发现它的控件是私有成员,因此您不仅可以设置框架的内容。 在所有BTW处都使用一个框架是一个坏主意,但我会在最后进行介绍。 在您的视图中添加一个公共方法,该方法将页面作为参数。 然后,该方法将成为您的ViewContatoFisico的一部分,并且可以对其控件进行更改。
public void SetContent(Page p)
{
this.FrameContatoFisico.Content = p;
}
然后,您需要拥有ViewContatoFisico才能进行任何操作。 您可以新建一个并显示它:
Page_Contato_Fisica p = new Page_Contato_Fisica(true, c);
ViewContatoFisico v = new ViewContatoFisico();
v.SetContent(p);
v.Show();
在这种情况下(如果您不小心的话),您的用户最终可能会面临大量此类负载。 我见过一些用户经常“丢失”窗口的应用程序,因为所有内容都会加载另一个窗口。
如果您已经展示了一个实例,或者希望避免出现多窗口问题,那么您可以获取对任何打开的实例的引用。 您可以将typeof(ViewContatoFisico)传递给:
private Window GetWindowInstance(Type winType)
{
Window win;
win = Application.Current.Windows
.OfType<Window>()
.SingleOrDefault(w => w.GetType() == winType);
if (win == null)
{
win = (Window)Activator.CreateInstance(winType);
}
return win;
}
然后,当然。
v.SetContent(p);
v.Show();
我的最后一条建议。 不要使用页面和框架。 请改用UserControl和ContentControl。 UserControl与Pages几乎相同,但更加灵活。 ContentControls的重量比框架轻得多,并且更加灵活。 框架的日记本包含对您放入其中的每个内容的引用。
我还建议您先研究MVVM和viewmodel。