午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

WPFとVBでアプリ作る準備その8、コントロールの削除、変数の中身が変化した時に何かの処理をしたい時はPropertyのSetで

前回は昨日
 
コントロールの削除
 
イメージ 1
選択画像の削除
 
前回の記事
WPFVBでアプリ作る準備その7、指定した間隔ごとにコントロールをマウスドラッグ移動 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/13924059.html
 
 
デザイン画面とXAML

f:id:gogowaten:20191025110332p:plain

削除ボタンを追加、名前はremoveにした
 
画像を表示するExImageクラス

f:id:gogowaten:20191025110342p:plain

前回から変化なし
 
 
MainWindow

f:id:gogowaten:20191025110353p:plain

水色の範囲が書き換えや書き加えたところ
Imports System.IO
Imports System.Windows.Controls.Primitives
Imports System.Windows.Controls.Panel
Imports System.Windows.Controls.Canvas


Class MainWindow
    'すべてのExImageを入れておくリストコレクション
    Private CollectionExImage As New ObservableCollectionExImage

    'Locate表示のtextBlockの更新
    Private Sub DisplayUpdateLocate(ex As ExImage)
        If ex Is Nothing Then
            tbLocate.Text = "Locate = "
        Else
            tbLocate.Text = "Locate = " & GetLeft(ex) & "," & GetTop(ex)
        End If
    End Sub

    '    VB プロパティの作成
    'http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard47.htm


    '選択中の画像(ExImage)を記録しておくプロパティ
    '選択画像が変わった時に見本画像更新したくて作った
    Private _FocusExImage As ExImage
    Private Property FocusExImage As ExImage
        Get
            Return _FocusExImage
        End Get
        Set(value As ExImage)
            'プロパティに値をセット、つまり中身が変化する
            _FocusExImage = value
            ''FocusExImageの中身が入れ替わった時実行
            Call DisplayUpdateLocate(value)
            '見本画像更新
            If value Is Nothing Then
                mihon.Source = Nothing
            Else
                mihon.Source = value.Source
            End If
        End Set
    End Property


    '削除ボタン押した時
    Private Sub remove_Click(sender As Object, e As RoutedEventArgs) Handles remove.Click
        If FocusExImage Is Nothing Then Return
        Call RemoveExImage(FocusExImage)
    End Sub

    '選択画像削除
    Private Sub RemoveExImage(ex As ExImage)
        Dim i As Integer = CollectionExImage.IndexOf(ex)
        CollectionExImage.Remove(ex) 'リストコレクションから削除
        canvas1.Children.Remove(ex) 'canvas1から削除(表示から消す)
        '削除後、選択画像(FocusExImage)の変更
        'ひとつ下の画像を選択、一番下だったらひとつ上の画像、最後の画像だったらNothingにする
        If i > 0 Then
            FocusExImage = CollectionExImage.Item(i - 1)
        ElseIf i = 0 AndAlso CollectionExImage.Count > 0 Then
            FocusExImage = CollectionExImage.Item(i)
        Else
            FocusExImage = Nothing
        End If
    End Sub

End Class
 
選択画像の削除で必要なのは
画像(ExImage)を配置している親コントロール(canvas1)から削除
すべての画像を入れてあるリストコレクション(CollectionExImage)から削除
別の画像を選択画像にする
 
必要じゃないけどあったほうがいいのは
選択画像の見本を表示しているImageコントロールの画像の切り替え
 
選択画像を削除する
RemoveExImage

f:id:gogowaten:20191025110417p:plain

WPFでのコントロールの削除はRemoveメソッドだけでいいみたい
WindowフォームアプリのようにDisposeは必要なさそう、ラクチン
なので削除は282,283の2行で終わり
残りの行は選択画像を別の画像にする処理
基本は削除した画像のひとつ下にあった画像を次の選択画像にしている
イメージ 6
黄色の画像を選択した状態で削除ボタン押すと
 
イメージ 7
ひとつ下の緑の画像が選択画像になる
緑の画像は一番下なので削除してひとつ下の画像を選択しようとしても
できないので、その時だけは逆にひとつ上の画像を選択することにする
 
イメージ 8
こうしたい
 
        If i > 0 Then
            FocusExImage = CollectionExImage.Item(i - 1)
        ElseIf i = 0 AndAlso CollectionExImage.Count > 0 Then
            FocusExImage = CollectionExImage.Item(i)
        Else
            FocusExImage = Nothing
        End If
削除した画像が一番下(最背面)じゃなければ削除した画像のひとつ下の画像
削除した画像が一番下でそれ以外に画像がまだあればひとつ上の画像
画像が1つもなければ空にする
って書いたけど、いま見てたらなんか冗長な感じがする
        If CollectionExImage.Count = 0 Then
            FocusExImage = Nothing
        ElseIf i = 0 Then
            FocusExImage = CollectionExImage(i)
        Else
            FocusExImage = CollectionExImage(i - 1)
        End If
画像が1つもなければ空にする
削除画像が一番下ならひとつ上の画像を選択
それ以外ならひとつ下の画像を選択
あんまり変わらないけどこっちのがいい
 
これで削除とそれに伴う選択画像(FocusExImage)の入れ替えができた
あとはアプリのウィンドウの左上にある見本画像の変更
これをしないと
イメージ 9
こうなる
この見本画像の変更したい時は削除した時以外にも
クリックで選択画像が切り替わった時がある
つまり二箇所ある、というか今回ので増えて二箇所になったから
それぞれに見本画像の変更する処理を書けばいいんだけど
選択画像が切り替わった時に動くイベントがあれば
その一箇所に書けばラクチンだなあって思って
変数 変更時イベントとかでググったら
 
VB.NET2008で、変数の変化によるイベント - VB.NETで、Boolea... - Yahoo!知恵袋
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1073962530
プロパティのセットのところで実行すればいい!
これはかなり基本的なことな気がするwでも全然思いつかなかったし
プロパティって自分で書いて使ったことほとんどないから
VB中学校の
VB プロパティの作成
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard47.htm
ここを見て書き直した
 
イメージ 11
前回まではこうだった
 
イメージ 10
今回、ずいぶん増えたけどこの方がいろいろできるし
ここ一箇所に書けばいいので他の部分が増えなくて済む
これで選択画像(FocusExImage)が切り替わった時っていうのは
この31行目からのSetのことだからこの後に処理を書けばいい
実際に切り替わるのは33行目なのかな、なのでそれ以降に書いた
37行目から41行目が見本画像を切り替える処理
 
これで見本画像切り替えは選択画像切替時に自動でできるようになり
イメージ 12
前回の152行めが不要になったので削除(コメントアウト)

 
予定しているテスト
  • 指定した色を透明にする
  • レイアウト
 
完了したテスト
  • 画像ファイルドロップで画像表示
  • 画像をマウスドラッグで移動
  • 表示画像のレイヤー間の移動(入れ替え)ZOrder指定
  • 表示画像すべてを画像ファイルとして保存
  • ドラッグ移動時に指定ピクセル数ごとに移動
  • 指定した画像の表示を消す(削除) ←New
 
テストと言いつつ継ぎ足しで書いていったから
作っているのとあんまり変わらなくなったなあ
 
 
ヤフーブログの文字数制限でコードが全部載せられなかったので
 
WPFVBでアプリ作る準備その8の記事のコード全文 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/13926875.html
この記事の続き

gogowaten.hatenablog.com

 
WPFVBでアプリ作る準備その9、XAMLでコントロールのレイアウト ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/13929569.html