午後わてんのブログ

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

WPFとVB.NET、追加したウィンドウをShowDialogで開く、開くときに値を持たせる

 
前回の記事

gogowaten.hatenablog.com

 
WPFVB.NETでカラーピッカーその2、HSVとRGBで色指定 ( ガーデニング ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14025927.html
ここで作ったカラーピッカーを取り入れて色を取得できるようにした
 
 
イメージ 1
色の選択ボタン押すと
 
イメージ 2
この前作ったカラーピッカーを表示
 
イメージ 3
適当な色を選んでOKボタンで
 
イメージ 4
色の取得完了
 
この動作はカラーピッカー用の別ウィンドウを追加して作っておいて
メインのウィンドウから呼び出す処理
カラーピッカーのウィンドウでOKが押されたら選択した色を
メインのウィンドウに渡す処理
 
 
 
アプリにWindowを追加するには

f:id:gogowaten:20191025122109p:plain

ソリューションエクスプローラーのアプリの名前のところを右クリック→
追加→ウィンドウ
 
もしくは

f:id:gogowaten:20191025122117p:plain

メニューのプロジェクト→ウィンドウの追加
これで
 

f:id:gogowaten:20191025122127p:plain

新しいウィンドウ追加のウィンドウが開くので適当な名前を付けて追加ボタンで
(画面ではWindow1ってなっているけど実際にはColorPaletteにした)
 
 

f:id:gogowaten:20191025122136p:plain

新しいウィンドウが追加される
6行目の
xmlns:local="clr-namespace:Pixtack紫陽花八重紫"
ここの名前は今のままにしておいて
それ以外はコピペして
 

f:id:gogowaten:20191025122147p:plain

こうなって
あとはOKボタンとキャンセルボタンが要るので追加
 

f:id:gogowaten:20191025122202p:plain

83から86行目が追加したところ
キャンセルボタンのプロパティに IsCancel="True"
OKボタンのプロパティに       IsDefault="True"
この設定が重要な気がする
XAMLの方の準備はこれでOK
次はカラーピッカーのVBのコード
 

f:id:gogowaten:20191025122213p:plain

コピペして
 

f:id:gogowaten:20191025122225p:plain

524行目からが追加したところ
Private Sub btOK_Click(sender As Object, e As RoutedEventArgs) Handles btOK.Click
    DialogResult = True
End Sub

Private Sub btCancel_Click(sender As Object, e As RoutedEventArgs) Handles btCancel.Click
    DialogResult = False
End Sub
XAMLのほうで追加した
OKボタンとキャンセルボタンのクリックイベントにそれぞれ
DialogResultをTrueとFalseを返すようにしておく
 
ウィンドウを開いた(ShowDialog)時には元の色を表示したいので
ShowDialogの時に色を受け取れるようにする
'ダイアログ開いた時、Colorを受け取ってスライダーに反映
Public Overloads Function ShowDialog(col As Color) As Boolean
   '初期設定のTransparent透明なら赤に強制変換
    If col.Equals(Colors.Transparent) Then
        col = Colors.Red
    End If
   'ARGBのスライダーに値設定、HSVの値はこの後のInitializeイベントで実行
    sldA.Value = col.A
    sldR.Value = col.R
    sldG.Value = col.G
    sldB.Value = col.B

    Return Me.ShowDialog
End Function
受け取った色をARGBそれぞれのスライダーに設定する
色が透明色の時は赤色を設定する
 
以上は
これはここを参照した
WPFサンプル:ShowメソッドとShowDaialogメソッド:Gushwell's C# Dev Notes
http://gushwell.ldblog.jp/archives/52285322.html

VB 2つ目のフォーム - Show, ShowDialog, DialogResult, Ownerなど
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard29.htm
 
あとはメインのウィンドウの方での設定は
カラーピッカーのウィンドウを表示するボタンを

f:id:gogowaten:20191025122237p:plain

この辺に追加して
このボタンのクリックイベントに
 
今の色を渡す処理とOKボタンが押されたら色を受け取る処理

f:id:gogowaten:20191025122246p:plain

Private Sub btGetTransparent_Click(sender As Object, e As RoutedEventArgs) Handles btGetTransparentColor.Click
    Dim cp As New ColorPalette
    cp.Owner = Me

    Dim b As SolidColorBrush = rectSelectColor.Fill

    If cp.ShowDialog(b.Color) Then
        With cp
            tbSelectColorARGB.Text = $"ARGB={ .sldA.Value},{ .sldR.Value},{ .sldG.Value},{ .sldB.Value}"
        End With
        rectSelectColor.Fill = cp.rectMihon.Fill
    End If
End Sub
 
ColorPaletteがカラーピッカーのウィンドウ
rectSelectColorは色表示用のRectangle
 
cp.Owner=Me
この1行は要らないかな、使っていない
 
ColorPaletteをダイアログ形式で開くのが
cp.ShowDialog
このとき元の色ってことでrectSelectColorの色を引数に入れている
開いたカラーピッカーのウィンドウでOKボタンが押されたら
ShowDialogにTrueが返ってくる
キャンセルボタンだったらFalseが返ってくるようにしたので
Falseならなにもしない
TrueならrectSelectColorの塗り色Fillをカラーピッカーウィンドウの
rectMihonの塗り色Fillと同じにする処理をする
 
このあたりのShowdialogのことは
WPFサンプル:ShowメソッドとShowDaialogメソッド:Gushwell's C# Dev Notes
http://gushwell.ldblog.jp/archives/52285322.html
ここを参照した
 
これでできたけどいまいちわかってなくて
とくにカラーピッカーのウィンドウでOK、キャンセルのどちらのボタンを
クリックした時でもカラーピッカーのウィンドウを閉じてくれる
この閉じる処理はどこにも書いていないんだけどしっかり閉じてくれるだよねえ
 
 
ダウンロード先
Pixtack紫陽花八重紫_20160403.zip