繁体   English   中英

无法转换类型的对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM