无法转换类型的对象

时间:2012-04-25 16:21:37

标签: c# wpf

尝试在我的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并设置它,然后我为这个公共字符串分配标签内容?

5 个答案:

答案 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应用程序中执行此操作的方式完全相同,以防有人关心,除非某些类/属性名称不同。