|
分類:[C#]
はじめまして、ぶなっぷです。
このたび、仕事で初めてのC#+XAMLということで悪戦苦闘中です(笑)
自作コントロールの描画をCanvas派生クラスのOnRender()にて行っています。 DrawingContextを使用したテキストの描画において、 DrawingContext.DrawText()の第一引数に与えるFormattedText()クラスの インスタンスなんですが、、、
コンストラクタの引数の多さにうんざり。 しかも、ほとんどの引数が毎回同じ値を代入するだけ。
そこで、以下のようなるFormattedTextの派生クラスを作成しました。
class MyFmtText : FormattedText { // デフォルト値 public static string DEF_FONTNAME { get; set; } // フォント名 public static double DEF_FONTSIZE { get; set; } // フォントサイズ public static Brush DEF_BRUSH { get; set; } // ブラシ public static CultureInfo DEF_CULTURE { get; set; } // カルチャー public static string DEF_CULTURESTR // カルチャー(文字列指定) { // setアクセサのみ set {DEF_CULTURE = CultureInfo.GetCultureInfo(value);} }
// デフォルト値の初期化 public static void InitializeDefaltValue() { DEF_FONTNAME = "Arial"; DEF_FONTSIZE = 10.0; DEF_BRUSH = Brushes.Black; DEF_CULTURE = CultureInfo.CurrentCulture; }
// コンストラクタ(static) static MyFmtText() { InitializeDefaltValue(); }
// コンストラクタ(instance) - 文字列のみ指定(文字列は左寄せ) public MyFmtText(string Text) : base(Text, DEF_CULTURE, FlowDirection.LeftToRight, new Typeface(DEF_FONTNAME), DEF_FONTSIZE, DEF_BRUSH) { }
// コンストラクタ(instance) - 文字列と文字幅,Alignment指定 // (Alignment未指定時、文字列は右寄せ) public MyFmtText(string Text, double Width, TextAlignment Alignment = TextAlignment.Center) : base(Text, DEF_CULTURE, FlowDirection.LeftToRight, new Typeface(DEF_FONTNAME), DEF_FONTSIZE, DEF_BRUSH) { MaxTextWidth = Width; TextAlignment = Alignment; } }
使うときはこんな感じです。 protected override void OnRender(DrawingContext DC) { MyFmtText.DEF_BRUSH = Brushes.Red; DC.DrawText( new MyFmtText("テキスト文字列"), new Point(10, 10)); }
非常に便利になったのですが、1点。 staticデフォルト値を初期化し忘れると、思わぬところに思わぬフォーマットの文字が(^-^;
C++ならデストラクタで、InitializeDefaltValue()呼ぶとかできるんですが、 C#だと、デストラクタなんていつ呼ばれるか分からないし、Dispose()実装してもusingして もらえなかったら無意味だし、、、 C++で言うデストラクタのような、うまい方法はあるのでしょうか?
|