WPF で mainWindow のボタンやテキスト ボックスなどのコントロールにアクセスしたいのですが、これができません。
Windows フォーム アプリケーションではとても簡単です。そのコントロールの修飾子を True に設定すると、その mainWindow のインスタンスからそのコントロールにアクセスできますが、WPF ではパブリック コントロールを宣言できません。これどうやってするの?
WPF で mainWindow のボタンやテキスト ボックスなどのコントロールにアクセスしたいのですが、これができません。
Windows フォーム アプリケーションではとても簡単です。そのコントロールの修飾子を True に設定すると、その mainWindow のインスタンスからそのコントロールにアクセスできますが、WPF ではパブリック コントロールを宣言できません。これどうやってするの?
別の WPF フォームのコントロールにアクセスするには、そのコントロールをパブリックとして宣言する必要があります。WPF のコントロールの既定の宣言は public ですが、次のコードで指定できます。
<TextBox x:Name="textBox1" x:FieldModifier="public" />
その後、アプリケーション内のすべてのアクティブなウィンドウを検索して、次のような制御を持つウィンドウを見つけることができます。
foreach (Window window in Application.Current.Windows)
{
if (window.GetType() == typeof(Window1))
{
(window as Window1).textBox1.Text = "I changed it from another window";
}
}
残念ながら、WPF の基本はデータ バインディングです。他の方法でそれを行うことは「規則に反する」ことであり、悪い習慣であり、一般的にコード化と理解が桁違いに複雑になります。
現在の問題に対して、ビュー間で共有するデータがある場合 (1 つのビューのみであっても)、データを表すプロパティを含むビュー モデル クラスを作成し、ビューのプロパティにバインドします。
コードでは、ビュー モデル クラスのみを管理し、実際のビューにはそのビジュアル コントロールとビジュアル コンポジションを使用しないでください。
WPFを開始したときもこれに苦労していました。しかし、古き良き時代の勝利フォームのアプローチに似た良い方法を見つけました(VB.NETのコーディング、申し訳ありません)。先に述べたことを追加すると、次のようになります。
アクティブなウィンドウのモジュールまたは別のクラスからオブジェクトのプロパティを直接変更するには:
Public Class Whatever
Public Sub ChangeObjProperties()
' Here the window is indexed in case of multiple instances of the same
' window could possibly be open at any given time.. otherwise just use 0
Dim w As MainWindow = Application.Current.Windows(0)
w.Button1.Content = "Anything"
End Sub
End Class
Whatever
コードで呼び出す前に、明らかにインスタンス化するChangeObjProperties()
必要があります。
また、オブジェクトのアクセシビリティに関する XAML でのネーミングについても心配する必要はありません。
コントロールを公開するには、次のように宣言するだけです。
<TextBox x:Name="textBox1" x:FieldModifier="public" />
その後、別のコントロールからアクセスできます。