1

在我的 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 应用程序,并且我有两个窗口 MainWindow.xaml 和 LoginWindow.xaml。

我想在身份验证后将一个字符串(学生 ID)从登录窗口传递到主窗口。

当我读到它时,我认为上述方法是如何做到的:((MainWindow)Application.Current.MainWindow).StudentID说我打算将字符串UserAuthenticationID发送到哪里?

然后在MainWindow.xaml我得到字符串UserAuthenticationID并设置它,然后我将标签内容分配给这个公共字符串?

4

5 回答 5

2

错误来了,因为它试图转换Application.Current.MainWindowMainWindow,事实上LoginWindow

当您覆盖一个对象时的建议,其他对象在它之前进行了检查

if(Application.Current.MainWindow is MainWindow)
{
 /// than do the code 
}
于 2012-04-25T16:27:23.853 回答
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;
    }
}
于 2012-04-25T16:32:43.253 回答
0

您的 Application.Current.MainWindow 似乎属于 LoginWindow 类型。但是您想将其强制转换为 MainWindow。两者都(也许)从 Window 派生。但是您不能将派生类强制转换为另一个派生类。

//编辑

尝试

((LoginWindow)Application.Current.MainWindow)

或将您的 Application.Current.MainWindow 更改为 MainWindow 类型的对象

//编辑 2 我想我明白你的意图是什么。您可以尝试以下方法:

在您按下按钮“登录”的登录窗口中,处理 Buttonevent(单击),获取来自任何位置的 ID(文本框),将其放入 MainWindow 的新实例中并设置

Application.Current.MainWindow

到 MainWindow 的新实例。如果我对你将如何做到这一点有误,你应该提供更多事实。

其他解决方案是 Ricibob 的 LoginDialog 解决方案。

于 2012-04-25T16:27:54.683 回答
0

看起来您试图将登录对话框中的 UserAuthenticationID 提供回您将其存储为 StudentId 的主窗口。
为什么不在主窗口中处理它例如:

if (login.ShowDialog())
    StudentId = login.UserAuthenticationID;
于 2012-04-25T16:41:54.480 回答
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();
        }
    }
}

虽然有很多方法可以让不同的窗口/表单进行通信,但这是我最喜欢的。窗口之间交互的所有逻辑都在一个地方(按钮单击事件)。主窗体明确“拥有” OtherWindowOtheWindow不需要知道什么MainWindow,只需要知道如何收集一些信息。 MainWindow将负责提取所需的信息。

按钮单击的代码甚至读起来就像您希望它执行的操作一样:创建一个新窗口,当它关闭时,将其内容设置为我的标签,然后显示表单。这一切都在一个地方,并且按照我逻辑思考的顺序(Show如果需要,您可以在之后附加事件处理程序)。

哦,这与我在 winforms 应用程序中执行此操作的方式完全相同,以防万一有人关心,除非某些类/属性名称会有所不同。

于 2012-04-25T17:15:59.247 回答