[英]Unable to cast object of type
我在wpf应用程序中尝试将字符串从一个窗口发送到另一个窗口时遇到错误:
无法将类型为“ WpfApplication4.LoginWindow”的对象转换为类型为“ WpfApplication4.MainWindow”的对象。
在我的登录窗口中,错误在此行上:
((MainWindow)Application.Current.MainWindow).StudentID = UserAuthenticationID;
在我的主窗口中,我要对此进行测试:
public string StudentId { get; set; }
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
label1.Content = StudentID;
}
我究竟做错了什么?
编辑:
到目前为止,没有任何答案是有意义的,这是由于我的问题不清楚,我创建了一个wpf应用程序,并且有两个Windows MainWindow.xaml和LoginWindow.xaml。
认证后,我想从登录窗口向主窗口传递一个字符串(学生ID)。
我在阅读时以为上面的方法是怎么做的: ((MainWindow)Application.Current.MainWindow).StudentID
说我要将UserAuthenticationID
字符串发送到哪里?
然后在MainWindow.xaml
获得字符串UserAuthenticationID
并进行设置,然后将标签内容分配给此公共字符串?
由于尝试将Application.Current.MainWindow
转换为MainWindow
(实际上是LoginWindow
。
当您覆盖一个对象之前的建议
if(Application.Current.MainWindow is MainWindow)
{
/// than do the code
}
大概是从主窗口创建登录窗口。 如果需要从登录窗口引用主窗口,则在构造登录窗口时将主窗口引用传递给登录窗口。 例如
void MainWindow_Loaded(object sender, RoutedEventArgs e) {
LoginWindow login = new LoginWindow(this);
login.ShowDialog();
}
class LoginWindow : Window {
MainWindow app_window;
public LoginWindow(MainWindow app_window) {
Owner = app_window;
this->app_window = app_window;
}
}
看来您的Application.Current.MainWindow是LoginWindow类型。 但是您想将其强制转换为MainWindow。 两者都(可能)从Window派生。 但是您不能将派生类强制转换为另一个派生类。
//编辑
尝试
((LoginWindow)Application.Current.MainWindow)
或将您的Application.Current.MainWindow更改为MainWindow类型的对象
//编辑2我想我明白你的意图了。 您可以尝试以下方法:
在您的LoginWindow中,按“登录”按钮处理Buttonevent(单击),获取ID的任何位置(文本框),将其放在MainWindow的新实例中并设置
Application.Current.MainWindow
到MainWindow的新实例。 如果我对您的处理方法有误,则应提供更多事实。
其他解决方案是Ricibob的LoginDialog解决方案。
好像您试图将登录对话框中的UserAuthenticationID反馈回主窗口,并将其存储为StudentId。
为什么不在主窗口中处理它,例如:
if (login.ShowDialog())
StudentId = login.UserAuthenticationID;
您需要重组程序的设计。 您想要做的并不难。 您实质上是在寻求一种在表单之间进行通信的好方法。
首先,除非您确实确定需要使用,否则我建议不要使用Application.Current.MainWindow
。 您可以使用它来使应用程序正常工作,但这并不是一个好的设计,并且会导致问题。
我们将从一些定义开始OtherWindow
这将是弹出。
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for OtherWindow.xaml
/// </summary>
public partial class OtherWindow : Window
{
public OtherWindow()
{
InitializeComponent();
}
public string SomeData
{
get
{
//you'll probably want to return the value of a textbox or something else
//the user fills in.
return "Hello World!";
}
}
}
}
从沟通的角度来看,真正重要的是它具有一个或多个属性,其中包含主表单将需要访问的信息。 显然,我已省略了用于实际收集要返回的数据的所有代码,而是硬编码了此示例的值。
现在为主要形式。 (我添加的只是一个按钮和一个标签。)
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
OtherWindow other = new OtherWindow();
other.Closed += (sender2, e2) =>
{
label1.Content = other.SomeData;
};
//either of the methods below, depending on desired behavior.
other.Show();
//other.ShowDialog();
}
}
}
尽管有很多方法可以使不同的窗口/窗体进行通信,但这是我的最爱。 窗口之间交互的所有逻辑都放在一个位置(按钮单击事件)。 主要形式显然是“拥有” OtherWindow
,并且OtheWindow
不需要了解有关MainWindow
,它只需要知道如何收集一些信息即可。 MainWindow
将负责提取所需的信息。
按钮单击的代码甚至读取您想要的内容:创建一个新窗口,关闭该窗口,将其内容设置为我的标签,然后显示该表单。 它全部放在一个地方,并且按照我逻辑上考虑的顺序进行(如果需要,可以在Show
之后附加事件处理程序)。
哦,这与我在winforms应用程序中也完全一样,以防万一有人在乎,除非某些类/属性名称会有所不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.