2011/04/27(Wed) 00:45:19 編集(投稿者)
2011/04/26(Tue) 19:48:34 編集(投稿者)
■No58791 (*aka*aka* さん) に返信
> WPFユーザコントロール側から、
> [Element Host]を配置した[Windows Form]上の[TextBox]等の値を参照に行くことは出来るのでしょうか。
できる/できないで言えばできますが、やらないように設計した方がいいと思います。
ElementHostを使う今回のような場合に限らず、「AがBを参照する」ような場合に
「BもAを参照する」というような設計・実装は良くないです。どちらか一方向の参照のみにした方がよいです。
方法としては、例えば、WPFユーザコントロールがTextBoxの値を欲しいタイミングで、
(1) WPFユーザコントロールがイベントを挙げる
(2) Windows Forms側でこのイベントを処理し、
・WPFユーザコントロールのプロパティXにTextBoxの値を設定する
または
・WPFユーザコントロールのメソッドXにTextBoxの値を引数として渡す
といったようにして、WPFユーザコントロールがXを介してTextBoxの値(というか単なる文字列)を知る
というのはどうでしょうか。
以下は超適当なサンプルです。
【前提】
・Windows FormsのForm1にはTextBox1とElementHost1を配置してあります。
・ElementHost1にはWPFユーザコントロールのUserControl1を設定しています。
・WPFユーザコントロールのUserControl1にはButton1が配置してあり、
これをクリックするとForm1のTextBox1.Textの内容をメッセージボックスで表示します。
【ソースのサンプル(かなり適当)】
'Windows FormsのForm1のコード
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AddHandler CType(ElementHost1.Child, UserControl1).WantText, AddressOf WantText
End Sub
Private Sub WantText(ByVal sender As System.Object, ByVal e As System.EventArgs)
CType(ElementHost1.Child, UserControl1).SetText(TextBox1.Text)
End Sub
End Class
' WPFユーザコントロール側のコード
Public Class UserControl1
Public Event WantText As EventHandler
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
RaiseEvent WantText(Me, EventArgs.Empty)
End Sub
Public Sub SetText(ByVal text As String)
MessageBox.Show(text)
End Sub
End Class
--
本題は以下のURLを参考にして実装してみたらできました。
http://social.msdn.microsoft.com/forums/en-US/wpf/thread/e73b14c9-995d-4174-aa22-693b2a34772f
http://social.msdn.microsoft.com/forums/en-US/wpf/thread/b0a5bfcd-db94-425d-9c56-07233441d055/
以下も超超適当なサンプルです。
【前提】
・WPFユーザコントロール内の適当な場所で以下のコードを実行する(例えばボタンのクリックイベントなど)
・参照先のWindows FormsのForm1にはTextBox1が配置してあります。
【ソースのサンプル(かなり適当)】
Dim wpfHandle As System.Windows.Interop.HwndSource = _
TryCast(System.Windows.PresentationSource.FromVisual(Me), System.Windows.Interop.HwndSource)
If (wpfHandle IsNot Nothing) Then
Dim host As System.Windows.Forms.Integration.ElementHost = _
TryCast(System.Windows.Forms.Control.FromChildHandle(wpfHandle.Handle), System.Windows.Forms.Integration.ElementHost)
MessageBox.Show(host.Parent.Controls("TextBox1").Text)
End If
--
<修正>モードを図表モードに変更</修正>