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 の 2 つのウィンドウを持っています。

認証後、ログイン画面からメイン画面に文字列(学生ID)を渡したい。

私が読んだように、上記の方法はそれを行う方法だと思いました:文字列をどこに送信する((MainWindow)Application.Current.MainWindow).StudentIDつもりですか?UserAuthenticationID

次にMainWindow.xaml、文字列を取得してUserAuthenticationID設定し、ラベルの内容をこのパブリック文字列に割り当てますか?

4

5 に答える 5

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 に答える
2

に変換しようとしたため、エラーApplication.Current.MainWindowが発生しました。MainWindowこれは実際には ですLoginWindow

あるオブジェクトをカバーしている場合の提案 他のオブジェクトの前にチェックを行った

if(Application.Current.MainWindow is MainWindow)
{
 /// than do the code 
}
于 2012-04-25T16:27:23.853 に答える
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!";
            }
        }
    }
}

コミュニケーションの観点から、本当に重要なのは、メインフォームがアクセスする必要のある情報を含む1つまたは複数のプロパティを持っていることです。明らかに、返すデータを実際に収集するためのすべてのコードを省略し、代わりにこの例の値をハードコーディングしました。

今度はメインフォームです。(追加したのはボタンとラベルだけです。)

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();
        }
    }
}

さまざまなウィンドウ/フォームを通信させる方法はたくさんありますが、これは私のお気に入りです。ウィンドウ間の相互作用のすべてのロジックが1か所にまとめられています(ボタンクリックイベント)。メインフォームは明らかに「所有」しておりOtherWindow、情報を知る必要はありOtheWindowませんMainWindow。情報を収集する方法を知っているだけで済みます。 MainWindow必要な情報の引き出しを担当します。

ボタンクリックのコードは、あなたがやりたいことと同じように読めます。新しいウィンドウを作成し、閉じたときにそのコンテンツを私のラベルに設定して、フォームを表示します。それはすべて1つの場所にあり、論理的に考えた順序で行われます(必要に応じて、後でイベントハンドラーをアタッチできShowます)。

ああ、これは私がwinformsアプリでもこれを行うのとまったく同じ方法です。誰かが気にかけている場合は、クラス/プロパティ名の一部が異なるという事実を除けば。

于 2012-04-25T17:15:59.247 に答える
0

ログインダイアログからUserAuthenticationIDをStudentIdとして保存しているメインウィンドウにフィードバックしようとしているようです。
メインウィンドウでそれを処理してみませんか。例:

if (login.ShowDialog())
    StudentId = login.UserAuthenticationID;
于 2012-04-25T16:41:54.480 に答える
0

Application.Current.MainWindow のタイプは LoginWindow のようです。しかし、それを MainWindow にキャストしたいとします。どちらも (おそらく) Window から派生しています。ただし、派生クラスを別の派生クラスにキャストすることはできません。

//編集

試す

((LoginWindow)Application.Current.MainWindow)

または Application.Current.MainWindow を MainWindow タイプのオブジェクトに変更します

//編集 2 あなたの意図が理解できたと思います。次のことを試すことができます。

ボタン「ログイン」を押したLoginWindowで、Buttonイベント(クリック)を処理し、IDがどこから来ても(TextBox)取得し、それをMainWindowの新しいインスタンスに入れ、設定します

Application.Current.MainWindow

MainWindow の新しいインスタンスに。あなたがどうするかについて私が間違っているなら、あなたはもっと多くの事実を述べるべきです。

その他のソリューションは、Ricibob の LoginDialog ソリューションです。

于 2012-04-25T16:27:54.683 に答える