WPFとVB.NET、エクセルのグループ化とグループ化解除を真似したい3
以前とは別の方法でグループ化と解除のテスト
デザイン画面とXAML
VBコード
前回までの方法だとうまく解決できない問題が出た
1→2→5の後にグループ化解除なら問題なけど、1から5までの順番だと6で縦横の拡大率がおかしくなる
これは各画像の表示を
Thumb.Template ┗Canvas ┗Image こうしていて、グループ化した時は Thumb.Template(c) ┗Canvas ┣Thumb.Template(a) ┃ ┗Canvas ┃ ┗Image ┗Thumb.Template(b) ┗Canvas ┗Image
こうなっていて
グループ化解除時に回転や拡大率の変形情報の引き継ぎがうまくできていないのがおかしくなる原因みたい
解決するのは難しそうだったので別の方法が今回のもので
グループ化は擬似的なものに変更したのが大きな違い
前回はグループ化するごとにThumbが増えていったけど、今回のは増やさないでどれとどれが同じグループですっていうグループ情報を各Thumbに持たせることにした
あるThumbを回転させるときグループに属していたら同じグループ内のThumb全部も同じように回転させる
そのグループ情報はこの部分、Group2って名前をつけたClassを作成
Itemsにはグループ直下のThumbすべてを入れる、グループ化解除の時使う
AllItemsはグループ全体に入っているThumbすべてを入れる
これを使えば移動や変形の指定をグループ全体のThumbにできる
Groupsはこのクラス自体のリスト、グループ同士をグループ化した時に使う
aNameはただの識別用の名前を入れるだけのもの
このGroup2を持たせるのがThumbを継承させたExThumb2って名前をつけたこれ
201行目にあるGroupTopにGroup2を入れる
これでGroupTop.AllItemsってすれば自分が属しているグループ全体のThumbすべてを取得できる
204行目はグループ化解除の時に活躍、CollectionのStackっていうもので初めて使うもの、これが面白い動きをしてアイテムを追加するのは他のリストとあんまり変わらないけど、取り出すときは最後に入れたものから取り出して、取り出したアイテムをリストに残すか削除するかを選べる
205行目以降は装飾的なものなのでグループ化とは関係ないところ
グループ化
※tはExThumb2を表す、Gはグループを表す
どのtをグループ化するのかって指定するからグループ化メソッドの引数は複数のtになる
グループ化の種類
- t同士をグループ化
- 複数Gのグループ化
- 単体Gとtをグループ化
1と2の時は新しいグループを作成
3の時は単体Gにtを統合(入れる)、つまり新しくグループを作成しない
これを判定するには引数のtにグループがいくつあるのか取得する必要がある
それがGetAllGroup2って名前をつけたこれ
すべてのt.GroupTopをリストに追加して
85行目でDistinctメソッドで重複のないのが得られるこれで渡されたtに含まれる重複のないすべてのG取得
グループ直下に加えるtを取得する
上のふたつを使って実際のグループ化の処理
131行目が重要、新しいGを作ったので今までのGは1階層下になるのでGroupStackプロパティにPushメソッドで今までのGを追加、これによって解除するときは1階層上げることになるのでその時取り出しやすくなる
132行目、新しいGをGroupTopプロパティに指定する
グループ化したいtを渡す
この中からグループ化したいtを指定して渡す
ここでは最終的にt0からt9までの10個全てをグループ化している
GetRangeメソッドはリストから指定範囲のアイテムを取り出してくれる
(0,2)なら0番から2個分の0と1
(2,2)なら2番から2個分の2と3
(6,4)なら6番から4個分の6,7,8,9
グループ化解除
解除するときは解除したいGを渡して処理
G3を解除する場合
t4とt5はG3直下で下の階層GはないのでGroupStackプロパティには何も入っていない=0、なのでGroupTopを削除するだけでいい、これが145行目
t0,t1はG1、t2,t3はG2がそれぞれGroupStackに入っているので
147行目でGroupStackのPopメソッドで下階層だったGを取り出して
148行目でGroupTopプロパティに指定
Popメソッドは最後に入れたものから取り出して、取り出したアイテムはStackから削除してくれる
初期状態
すべてのtはG5に入っているので
どのtを選択しても選択GはG5になるし
どれをマウスドラッグ移動しても全部まとまって動く
ここで選択グループを解除すると
G5が解除されてG3,G4に別れる
t6からt9のどれかをクリックしてから解除すると
G4が解除されてt6からt9は別々にドラッグ移動できるようになる
どのグループにも属していないのでNothingになる
今回はここまでで肝心な回転とかの変形はまだなんだよねえ
前回の記事から10日くらい経っているんだなあ
Public Class Group2
Public Property Items As New List(Of ExThumb2)
Public Property AllItems As New List(Of ExThumb2) 'すべてを取得する時用
Public Property Groups As List(Of Group2)
End Class
これにたどり着くまで時間がかかった、とくに
Public Property Groups As List(Of Group2)
これ、自分と同じClassをプロパティに持つってのがね、なんかこれでいいのかなってムズムズする、無限ループみたい
WPF: XAML, C# で TextBlock などの要素内の文字列を改行させる « をぶろぐ感謝!
http://tetsuwo.tumblr.com/post/59191241888/wpf-xaml-csharp-textblock-break-word-wrap
今回のコード一式
Wpf_test125_グループ化8 - Visual Studio Team Services
https://gogowaten.visualstudio.com/WPF/_git/WPF_test7?path=%2FWpf_test125_%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E5%8C%968&version=GBmaster&_a=contents
https://gogowaten.visualstudio.com/WPF/_git/WPF_test7?path=%2FWpf_test125_%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E5%8C%968&version=GBmaster&_a=contents
前回までの方法(なんか違う)のコード一式
Wpf_test120_グループ化5 - Visual Studio Team Services
https://gogowaten.visualstudio.com/WPF/_git/WPF_test7?path=%2FWpf_test120_%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E5%8C%965&version=GBmaster&_a=contents
https://gogowaten.visualstudio.com/WPF/_git/WPF_test7?path=%2FWpf_test120_%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E5%8C%965&version=GBmaster&_a=contents
関連記事、古い順
2週間前
WPFとVB.NET、エクセルのグループ化を真似したいからまずはグループ化のRectを取得 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14151447.html
WPFとVB.NET、ControlTemplateをコードで作成 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14156250.html
前回の記事
WPFとVB.NET、エクセルのグループ化とグループ化解除を真似したい2 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14161262.html
http://blogs.yahoo.co.jp/gogowaten/14151447.html
WPFとVB.NET、ControlTemplateをコードで作成 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14156250.html
前回の記事
WPFとVB.NET、エクセルのグループ化とグループ化解除を真似したい2 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14161262.html
翌日
WPFとVB.NET、マウスドラッグ移動で範囲選択、枠表示して枠内のものを取得 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14190065.html
↑の記事と今回の記事を合わせてできたのが↓↓
WPFとVB.NET、エクセルのグループ化とグループ化解除を真似したい4 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14203583.html
http://blogs.yahoo.co.jp/gogowaten/14190065.html
↑の記事と今回の記事を合わせてできたのが↓↓
WPFとVB.NET、エクセルのグループ化とグループ化解除を真似したい4 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14203583.html
2016年6月3日追記
130行目をこっそり修正
誤 For Each t As ExThumb2 In tl
正 For Each t As ExThumb2 In allt