尝试在我的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
并设置它,然后我为这个公共字符串分配标签内容?
答案 0 :(得分:2)
发生错误是因为它试图将Application.Current.MainWindow
转换为MainWindow
,这实际上是LoginWindow
。
建议当你将一个对象转换为其他对象之前进行检查
if(Application.Current.MainWindow is MainWindow)
{
/// than do the code
}
答案 1 :(得分:2)
据推测,您可以从主窗口创建登录窗口。如果需要从登录窗口引用主窗口,则在构建时将主窗口引用传递给登录窗口。例如
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;
}
}
答案 2 :(得分:0)
您的Application.Current.MainWindow似乎是Type LoginWindow。但是你想把它投射到MainWindow。两者都来自Window(也许)。但是你不能将派生类强制转换为另一个派生类。
//修改
尝试
((LoginWindow)Application.Current.MainWindow)
或将Application.Current.MainWindow更改为MainWindow类型的对象
//编辑2 我想我理解你的用意。您可以尝试以下方法:
在您的LoginWindow中按下按钮“登录”处理Buttonevent(点击),从中获取ID(TextBox),将其放入MainWindow的新实例并设置
Application.Current.MainWindow
到MainWindow的新实例。如果我对你的表现有误,你应该提供更多的事实。
其他解决方案是Ricibob的LoginDialog解决方案。
答案 3 :(得分:0)
您似乎尝试将登录对话框中的UserAuthenticationID反馈回主窗口,然后将其存储为StudentId。
为什么不在主窗口中处理它:例如:
if (login.ShowDialog())
StudentId = login.UserAuthenticationID;
答案 4 :(得分:0)
您需要重新构建程序的设计。你想做的事情并不十分艰难;你本质上是在寻求一种表达形式之间沟通的好方法。
首先,除非您确定需要,否则我建议不要使用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应用程序中执行此操作的方式完全相同,以防有人关心,除非某些类/属性名称不同。