C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: Windows FormによるElement Hostの使用


(過去ログ 98 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■58626 / inTopicNo.1)  Windows FormによるElement Hostの使用
  
□投稿者/ *aka*aka* (31回)-(2011/04/18(Mon) 21:29:17)

分類:[VB.NET/VB2005 以降] 

【環境:Win7 Pro、Visual Studio 2010 Express VB.NET】

@[Windows Form]内に配置した[Element Host]を介し、WPFユーザコントロールを連結しています。
 その[Element Host]内に表示されるWPFユーザコントロールを縮小したり拡大したりすることは可能でしょうか。

ADBから取得したデータ内容を、[Windows Form]のコードから、[Element Host]内の
 WPFユーザコントロール上に配置した[TextBox]へ値設定したり出来るのでしょうか。
 具体的にどのように記述すれば良いのでしょうか。

WPF初心者で初歩的な質問ですがよろしくお願いします。

引用返信 編集キー/
■58639 / inTopicNo.2)  Re[1]: Windows FormによるElement Hostの使用
□投稿者/ よねKEN (687回)-(2011/04/19(Tue) 22:46:52)
2011/04/19(Tue) 22:51:28 編集(投稿者)
Windows FormでWPFをホストするのはやったことがなかったので実験してみました。

■No58626 (*aka*aka* さん) に返信
> 【環境:Win7 Pro、Visual Studio 2010 Express VB.NET】
> 
> @[Windows Form]内に配置した[Element Host]を介し、WPFユーザコントロールを連結しています。
>  その[Element Host]内に表示されるWPFユーザコントロールを縮小したり拡大したりすることは可能でしょうか。

ElementHostコントロールにはChildプロパティがあり、このプロパティを介してWPFユーザコントロールにアクセスできます。
WPFユーザコントロール全体を拡大/縮小するのであれば、
UIElementクラスが持つRenderTransformプロパティにScaleTransformクラスのインスタンスを
設定するのが簡単じゃないでしょうか。以下のようにすればできます。

--コード例 ここから--

'WPFユーザコントロール全体を1.5倍に拡大
Me.ElementHost1.Child.RenderTransform = New System.Windows.Media.ScaleTransform(1.5, 1.5)

--コード例 ここまで--

WPFユーザコントロール全体ではなく、その中の一部のコントロールだけ、とかだと
Childプロティ経由で子どものコントロールにアクセスすることが必要なのと、
RenderTransformプロパティを使うべきかLayoutTransformプロパティ(FrameworkElementクラスで定義)を
使うべきか、といったところも判断が必要になってくるかもしれません。

> ADBから取得したデータ内容を、[Windows Form]のコードから、[Element Host]内の
>  WPFユーザコントロール上に配置した[TextBox]へ値設定したり出来るのでしょうか。
>  具体的にどのように記述すれば良いのでしょうか。

XAMLが以下のように定義されている場合を例にとります。

<UserControl x:Class="UserControl1"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
   xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
   mc:Ignorable="d" 
   d:DesignHeight="300" d:DesignWidth="300">
    <Grid Height="147" Width="191">
        <TextBox Height="24" HorizontalAlignment="Left" Margin="12,24,0,0" Name="TextBox1" VerticalAlignment="Top" Width="120" />
    </Grid>
</UserControl>


--コード例 ここから--

' WPFユーザコントロール内のTextBoxに"ABC"を設定
Dim cc As System.Windows.Controls.ContentControl = CType(Me.ElementHost1.Child, System.Windows.Controls.ContentControl)
Dim p As System.Windows.Controls.Panel = CType(cc.Content, System.Windows.Controls.Panel)
Dim textBox As System.Windows.Controls.TextBox = CType(p.Children(0), System.Windows.Controls.TextBox)
textBox.Text = "ABC"

--コード例 ここまで--


長ったらしいコードで書いてしまってますが、やっていることは以下のような内容です。
ElementHostのChildプロパティ→ContentControlのContentプロティ→PanelのChildrenプロパティ→TextBoxのTextプロパティ
(WPFユーザコントロールを取得) (Gridを取得)                     (要素0番目であるTextBoxを取得)


綺麗なソースコードを目指すなら、WPFユーザコントロール側で上記のようなごちゃごちゃした部分は
実装してしまって、拡大縮小やTextの取得/設定のためのプロパティかメソッドを公開するようしてやると
Windows Form側のソースコードがもっとすっきりすると思います。

引用返信 編集キー/
■58668 / inTopicNo.3)  Re[2]: Windows FormによるElement Hostの使用
□投稿者/ *aka*aka* (32回)-(2011/04/21(Thu) 13:58:01)
No58639 (よねKEN さん) に返信
> 2011/04/19(Tue) 22:51:28 編集(投稿者)

ご回答ありがとうございました。
参考にさせて頂きます。



解決済み
引用返信 編集キー/
■58791 / inTopicNo.4)  Re[3]: Windows FormによるElement Hostの使用
□投稿者/ *aka*aka* (40回)-(2011/04/26(Tue) 15:44:09)
No58668 (*aka*aka* さん) に返信
> ■No58639 (よねKEN さん) に返信
>>2011/04/19(Tue) 22:51:28 編集(投稿者)

WPFユーザコントロール側から、
[Element Host]を配置した[Windows Form]上の[TextBox]等の値を参照に行くことは出来るのでしょうか。
引用返信 編集キー/
■58796 / inTopicNo.5)  Re[4]: Windows FormによるElement Hostの使用
□投稿者/ shu (655回)-(2011/04/26(Tue) 17:41:15)
No58791 (*aka*aka* さん) に返信
> ■No58668 (*aka*aka* さん) に返信
>>■No58639 (よねKEN さん) に返信
> >>2011/04/19(Tue) 22:51:28 編集(投稿者)
>
> WPFユーザコントロール側から、
> [Element Host]を配置した[Windows Form]上の[TextBox]等の値を参照に行くことは出来るのでしょうか。
ユーザーコントロールならイベントを起こして、必要な情報を渡して、Form側で処理するか
publicなメソッドを用意してForm側から呼んでもらうかした方がいい気がします。
引用返信 編集キー/
■58802 / inTopicNo.6)  Re[5]: Windows FormによるElement Hostの使用
□投稿者/ *aka*aka* (41回)-(2011/04/26(Tue) 18:52:45)
No58796 (shu さん) に返信
> ■No58791 (*aka*aka* さん) に返信
>>■No58668 (*aka*aka* さん) に返信
> >>■No58639 (よねKEN さん) に返信
>>>>2011/04/19(Tue) 22:51:28 編集(投稿者)
>>
>>WPFユーザコントロール側から、
>>[Element Host]を配置した[Windows Form]上の[TextBox]等の値を参照に行くことは出来るのでしょうか。
> ユーザーコントロールならイベントを起こして、必要な情報を渡して、Form側で処理するか
> publicなメソッドを用意してForm側から呼んでもらうかした方がいい気がします。

誠に申し訳ないですが、
無知なため具体的なコード例を挙げて頂ければ非常に助かります。
引用返信 編集キー/
■58803 / inTopicNo.7)  Re[4]: Windows FormによるElement Hostの使用
□投稿者/ よねKEN (692回)-(2011/04/26(Tue) 19:47:26)
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

--
<修正>モードを図表モードに変更</修正>

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -