お次はWPFで俳句プログラミングをしてみたよー!

Myoga-SB-SDF-A2

Hello~! ミョウガです!

早くもニアは、俳句カードを出力するVBAマクロを作ったみたい。

 

わたしだって負けませんっ!

ということで、今回は俳句を縦書きで表示するWPFアプリを作ってみました。

 

1. WPF(言語はC#とXAML)で俳句を縦書きで表示してみたよ

まずは、俳句を表示するXAMLファイルと文字列を縦書きの俳句変換するC#ソースコードを作りましたよっ!

※このプログラムは https://gist.github.com/Myoga1012/c61584bf5a408af1129c で公開されています。

 

動作としてXAML側では、Grid.ColumnDefinition系でウィンドウ(というよりは、ウィンドウ内に設置したGrid)を横3つに分割して、それぞれ中にTextBlockを設置し、C#側では、文字列をカンマ以外の各文字の後に改行記号「\n」を入れた後、カンマで区切って、文字列配列のPhraseプロパティに代入します。こうすることで、各句の文字列が縦書きになります。

文字列を数回以上操作する時は、StringBuilderクラスを使うと効率がよいですよっ!

あとは、TextBlockのTextプロパティを先ほどのPhraseプロパティでバインディングします。WindowのデータコンテキストにHaikuクラスを設定することを忘れずにね。

 

2. ユーザーから俳句を入力できるようにしてみよう

せっかくなので、ユーザーからテキストボックスに俳句を入力し、ウィンドウに俳句をリアルタイムで表示できるようにしてみましたっ!

※Haiku2.xaml用の分離コードはコンポーネントの初期化のみなので省略します。

※このプログラムは https://gist.github.com/Myoga1012/c61584bf5a408af1129c で公開されています。

 

動作としてXAML側では、入力用のTextBoxと俳句を表示するためのItemsControlを設置します。ItemsSourceプロパティをTextBoxのTextプロパティでバインディングして、StackPanelで水平方向に並べたTextBlockのTextにItemsSourceの各要素を設定するのですが、その文字列を俳句用に変換するために、C#側で作成したHaikuConverterクラスを使います。

HaikuConverterクラスではIValueConverterインターフェースを継承して、ConvertメソッドとConvertBackメソッドを実装していきます。今回はTextBox.Text→ItemsControl.ItemsSourceへの一方通行なので、Convertメソッドの方をコーディングしていきます。

TextBoxで入力した文字列がConvertメソッドのvalueに渡されるので、文字列型にキャストしてStringBuilderクラスのコンストラクターに渡します。そしてHaiku.csと同じ様に、各文字の後ろに改行記号を入れてカンマで分割し、文字列の配列にします。

この状態でItemsSourceに渡すと、StackPanel上で左から順に句が並び、左縦書きのように表示されてしまいます。そこでReverseメソッドを呼び出し、要素の並びを反転します。

wpf2

最終的にIEnumerable<string>型になりますが、ターゲットであるItemsSourceのIEnumerable型です。IEnumerable<T>インターフェースはIEnumerableインターフェースを継承しているので問題ナッシングですよっ!

ちなみに、C#の配列はIEnumerable<T>とIEnumerableを実装したArray型の派生なので、Splitメソッドの戻り値(文字列の配列)をItemsSourceに渡しても大丈夫だよ。

 

実行結果はこんな感じ。

 

やっぱWPFでプログラミングするなら、データバインディングしたいよねっ!

ではでは、See youですよっ♪

 

3. 【追記】String.JoinとReplaceでHaikuConverterを最適化

各文字の後に改行記号を入れるもう1つの手段として、TextBoxから取得した文字列をToCharArrayメソッドで一旦char型配列にばらし、String.Joinメソッドで改行記号で区切った文字列を生成する方法を思いつきました。

 

あとは同じようにカンマで分割して要素の並びを反転すればよいのだけど、句の先頭にある改行記号を取り除くために、分割する前にReplaceメソッドでカンマの直後の改行記号を取っ払います。

これで変換処理が1文になり、スッキリしましたよっ!

 

この記事をシェアする
Chronoir.netのRSSフィードを購読する

About : ミョウガ(Myoga)

Hello~! 「ミョウガ」です。よろしくお願いします!(≧▽≦)/ 主にC#/XAML/C++などをメインにプログラミングやアプリの開発をしています。好きな物はカフェラテとハーブティ、趣味は写真撮影と艦これです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*