WPF でウォーターマーク(Watermark、透かし、淡色テキスト)を付ける方法をネット検索すると、ヒットするのはほとんど xaml を編集するやり方だと思いますが、ここではプログラムコードによる方法をご紹介します。
なるべく分かりやすいシンプルな方法で・・・と思って検討した結果、TextBox の新規コントロールのインスタンスを作ってそこにウォーターマークを表示して、それを対象コントロールの上に重ねる方法に落ち着きました(ぴったり重ねたい対象コントロールは TextBox か ComboBox なので、それに重ねるコントロールも TextBox が相性が良い)。
対応している対象コントロールは TextBox、ComboBox(IsEditable = True)、ListBox、ListView です。
こんな感じ。
コントロールにフォーカスが移るか、値が入ると(パスワードのウォーターマークを除いて)ウォーターマークが消えます。
パスワードのウォーターマークは、ボックスにキャレットを入れたとき(フォーカスしたとき)のみ、値が表示されるようにしました。
各コントロールにウォーターマークを付けるコードはこんな感じ。
Call SetWatermark(oTargetControl:=Me.ComboBox1, WaterMarkText:=” うぉーたーまーく”)
で、SetWatermark 関数はこんな感じ(全コードを掲載すると、スマホで見たとき画面がフリーズするようなので、テキストファイルをダウンロードできるようにしました)。
ちなみに、参考までにですが、上記コードと同じことを xaml でやろうとすると、だいたい下記のようになります(上記ファイルの下のほうに記載しているのと同じもの)。
ただし、この記事はプログラムコードでの処理を主目的としたものなので、この xaml コードはあまり実用向きではないかもしれません(?)。