の続き
動的作成したコントロールにテンプレートを指定する
その後からテンプレートの中のコントロールを取得していろいろ設定を変更
目的は画像ファイルがアプリのウィンドウにドロップされたら表示して
マウスドラッグで移動させること…前回と一緒なんだけど
画像ファイルを表示するのに適したコントロールはImage
マウスドラッグで移動させるコントロールで最適なのはThumb
どちらも目的には一長一短
このふたつを組み合わせて使いたい
ググったらControlTemplate(テンプレート)ってのを使えばできそうで
なんとかできた感じ
画像ファイルドロップで表示しするのは後回しにして
ThumbとImageを組み合わせたものに画像を表示してみることから
Thumbコントロールの名前はthumb1
Imageコントロールの名前はimage1にした
image1に表示する画像ファイルの指定はボタンコントロールのクリックイベントにした
ボタンクリックイベント中身は
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
Dim img As Image = thumb1.Template.FindName("image1", thumb1)
img.Source = bmp
img.Width = bmp.PixelWidth
img.Height = bmp.PixelHeight
End Sub
画像を表示するにはControlTemplateの中にあるimage1のSourceプロパティにBitmapImage(画像)を指定すればいいだけ
image1を取得するには
Template.FindNameメソッドを使う
thumb1の中のControlTemplateの中のImage1を取得するので
Dim img As Image = thumb1.Template.FindName("image1", thumb1)
これでOK
あとはimage1のSourceにBitmapImageを指定すればthumb1に画像が表示される
img.Source = bmp
実行したところ
ボタンクリックすると
画像が表示される
OK
後回しにしていた画像ファイルドロップで表示するには
動的に作成したThumbコントロールにTemplateを指定する
って方法でできた
でもVBのコードでTemplateを作成する方法がわからなかったので
デザイン画面のXAMLの方でTemplateを用意しておいて
それをコードのほうで取得して指定することにした
デザイン画面でTemplateの用意したところ
ControlTemplateのKeyをctにして
ImageのNameをimage1にしてみた
KeyやNameはVBのコードからこのControlTemplateやImageを取得するときに必要になる
動的作成したThumbにこのControlTemplateを指定して
その中のimage1に画像を指定すればThumbに画像が表示されることになる
VBコード
例外処理してないけど
画像ファイルドロップで表示した画像をマウスドラッグで移動できるようにした
'ファイルパスからBitmapImage(画像)を作成して返す
Private Function GetBitmapImage(filePath As String) As BitmapImage
これは前回の
WPFとVBでアプリ作る準備その1、マウスドラッグでコントロールの移動 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログこの記事の時と同じかな
http://blogs.yahoo.co.jp/gogowaten/13900213.html
ファイルをロックしないようにfilestreamを使ってBitmapImageを作成
'ドラッグ移動
Private Sub Thumb_Dragdelta(sender As Object, e As DragDeltaEventArgs)
ドロップされたパスをすべて取得する
これも前回の記事と同じかな違うのはImageを作るのがThumbに変わったところ
28行目の
Call AddThumb(filesPath(i), locate) 'Thumb作成表示
Private Sub AddThumb(filesPath As String, locate As Point)
ctというKeyを持ったControlTemplateを取得すると同時に
これをt(Thumb)のTemplateに指定している
あとはTemplateの中のImageを取得して画像を指定したいけど
作成完了してからじゃないとできないみたいなので
Loadedイベントでするようにしているのが61行目の
AddHandler t.Loaded, AddressOf thumb_Loaded
ここで困ったのがLoadedイベントの時にどうやって画像ファイルのパス取得するか
いろいろ方法はあるけど、今回は作成したThumbのTagプロパティに持たせることにしたのが55行目
t.Tag = filesPath 'Tagプロパティに画像ファイルのパスを入れておく
ここが終わるとLoadedイベントが発生する
Private Sub thumb_Loaded(sender As Object, e As RoutedEventArgs)
ThumbができあがったらLoadedイベントが発生するのでここで画像を読み込んで指定する
画像取得はGetBitmapImageメソッドに投げる、この時必要なファイルパスはTagプロパティに入れておいたものを使っているのが14行目
Dim bmp As BitmapImage = GetBitmapImage(t.Tag)
(Thumb(t)のTemplateの中のControlを取得するには
Template.FindNameに取得したいControlの名前を指定する
今回取得したいImageにはimage1という名前を付けておいたので
17行目の
t.Template.FindName("image1", t)
これで取得できている
あとは取得したImage(img)のSourceプロパティに画像をしてすれば全て完了
今回もいろいろ新しいのを使った
デザイン画面のXAMLでは
Window.Resources
ControlTemplate
VBのコードでは
Resources.Item
一番難しかったのがControlTemplateの中のControlを取得する
Template.FindName
動的に作成しているControlが作成完了した後なら使えるけど
作成している途中では使えないってのがわからなくて諦めかけてたところに
片鱗懐古のブログ: wpf : TemplateからNameを元にコントロールを探すどうやらインスタンス化してからじゃないとできないみたい
http://pieceofnostalgy.blogspot.jp/2012/05/wpf-templatename.html
よくわかんないけど見よう見まねでなんとかなった次第
画像ファイルドロップして
表示された画像をマウスドラッグしているところ
こういう普通っぽい画像でgif動画を作ると簡単に1MBを超えちゃうんだよねえ
上のgif動画は0.2MB
予定しているテスト、上の3つは必要な機能
- 表示画像すべてを画像ファイルとして保存
- ドラッグ移動時に指定ピクセルごとに移動
- 表示画像のレイヤー間の移動(入れ替え)ZOrder指定
- 指定した色を透明にする
- レイアウト
完了したテスト
- 画像ファイルドロップで画像表示
- 画像をマウスドラッグで移動
全然進んでいないように見えるw
参照したところ
[C#] WPFのThumbコントロールを使ってドラッグを実装する | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/3701
M'sLabo report: コードで生成したコントロールに静的リソースを適用する方法
http://mslaboratory.blog.eonet.jp/default/2012/11/post-4482.html
片鱗懐古のブログ: wpf : TemplateからNameを元にコントロールを探す
http://pieceofnostalgy.blogspot.jp/2012/05/wpf-templatename.html
WPF_test3 (master) - Visual Studio Team Servicesコードはここにおいてみた、自分以外でも見えるかな
https://gogowaten.visualstudio.com/DefaultCollection/WPF/_git/WPF_test3?path=%2F&version=GBmaster&_a=contents
ってのが今回のもの
Gitってのは便利らしいけど使い方がわからなくてただのファイル置き場みたいになっているw
WPFとVBでアプリ作る準備その3、ImageコントロールにDragDeltaイベントがほしくて擬似DragDelta ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/13911101.html
2016年5月21日追記
WPFとVB.NET、ControlTemplateをコードで作成 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14156250.html
2016年5月22日追記
WPFとVB.NET、ControlTemplateを使ったThumbを回転表示する時に回転させるのはどれがいいのか ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14157487.html