none
フレーム内のページからメインフォーム配置のコントロールを変更する方法 RRS feed

  • 質問

  • VisualStudio2013でアプリケーションを作成しております。

    ウインドウ(WPF)に表示用のLabelと画面切替用のFrameコントロールを配置しています。

    ・MainForm.xaml(ウインドウWPF)

      <Label Name="Label1" Content="AAA"/>

          <Frame Name="MainFrame">

    ・Page1.xaml(ページWPF)

    (質問)

    Page1.xamlからMainForm.xamlに配置のLabelのContentを変更したいのですが変更できません。

    Page1.xaml のボタンイベントに下記を記述

    Dim frm AS New MainForm

    frm.Label1.Content = "BBB"

    としてもMainFormのLabelがBBBに書き換わりません。

    基本的な問題で大変申し訳ありませんが、どなたかご教授よろしくお願いいたします。

    2015年10月29日 5:24

回答

  • こんにちは。

    以下を参考に試してみてはどうでしょうか。
    https://social.msdn.microsoft.com/Forums/vstudio/en-US/9dc929cf-38dd-4abd-9baf-a7f44ee4dd7f/wpf-child-page-get-parent-frame-vbnet?forum=wpf

    Class Page1
        Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
            Dim parent = TryCast(Application.Current.MainWindow, MainWindow)
            If parent IsNot Nothing Then
                parent.Label1.Content = "BBB"
            End If
        End Sub
    End Class
    Window.GetWindow(Me)でも取得できます。


    2015年10月29日 6:14
    モデレータ
  • 基本的なオブジェクト指向の概念であるインスタンスの理解が不足しているようです。

    Dim frm AS New MainForm

    としてしまうと、今表示しているMainFormとは別のMainFormが作成されます。Showメソッドを実行していないので、このMainFormは表示されていません。つまり、
    今表示されているMainFormのインスタンスと、今作成した表示されていないMainFormのインスタンスの2つが存在することになります。

    frm.Label1.Content = "BBB"

    は、後者のインスタンスに対する操作ですので、今表示されているMainFormには何ら変化がないのです。
    よって、ボタンをクリックした際に、今表示しているMainFormを見つけ、そこにあるLabelのContentを変更する必要があります。例えば、以下のようにすると良いでしょう。GetWindowでPage1が含まれるWindowを得て、そこにあるLabel1に値をセットしています。

    DirectCast(Window.GetWindow(Me), MainForm).Label1.Content = "BBB"


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2015年10月30日 2:09
    • 回答としてマーク 星 睦美 2015年12月3日 8:27
    2015年10月29日 6:27
    モデレータ

すべての返信

  • こんにちは。

    以下を参考に試してみてはどうでしょうか。
    https://social.msdn.microsoft.com/Forums/vstudio/en-US/9dc929cf-38dd-4abd-9baf-a7f44ee4dd7f/wpf-child-page-get-parent-frame-vbnet?forum=wpf

    Class Page1
        Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
            Dim parent = TryCast(Application.Current.MainWindow, MainWindow)
            If parent IsNot Nothing Then
                parent.Label1.Content = "BBB"
            End If
        End Sub
    End Class
    Window.GetWindow(Me)でも取得できます。


    2015年10月29日 6:14
    モデレータ
  • 基本的なオブジェクト指向の概念であるインスタンスの理解が不足しているようです。

    Dim frm AS New MainForm

    としてしまうと、今表示しているMainFormとは別のMainFormが作成されます。Showメソッドを実行していないので、このMainFormは表示されていません。つまり、
    今表示されているMainFormのインスタンスと、今作成した表示されていないMainFormのインスタンスの2つが存在することになります。

    frm.Label1.Content = "BBB"

    は、後者のインスタンスに対する操作ですので、今表示されているMainFormには何ら変化がないのです。
    よって、ボタンをクリックした際に、今表示しているMainFormを見つけ、そこにあるLabelのContentを変更する必要があります。例えば、以下のようにすると良いでしょう。GetWindowでPage1が含まれるWindowを得て、そこにあるLabel1に値をセットしています。

    DirectCast(Window.GetWindow(Me), MainForm).Label1.Content = "BBB"


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2015年10月30日 2:09
    • 回答としてマーク 星 睦美 2015年12月3日 8:27
    2015年10月29日 6:27
    モデレータ
  • 1つ言い忘れました。

    Wndowsフォームの開発者がWPFのプログラミングを行うと、その経験からLabelを何気なく使ってしまいがちです。WPFにはTextBlockというのもあります。両者の違いはネット上でも多く解説されていますので、もしご存じなければ調べてみて下さい。
    今回掲載されたコードを見て、このケースではTextBlockで十分だと思いましたので、念のために補足させていただきました。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年10月30日 2:25
    モデレータ