忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

C# 3.0 のObject InitializerでWPF

.Net 3.0のグラフィックス技術である
Windows Presentation Foundation(WPF)は
その前のWindows Formsよりも良い設計で柔軟なのですが、
「柔軟すぎて使うクラス数が増えすぎてイヤ」
ということもあるかもしれません。

また、コンストラクタに引数を摂るクラスがなんとなく少なめなので
コンストラクタに引数を渡せたら1行で済むところが
何行にもわたってしまうこともあるでしょう。

そんなときにはC# 3.0のObject Initializerです。

これを使うと、C#でWPFを使ったときのごちゃごちゃ感が
少なくなり見通しが良くなります。
(まぁ行数は減らないかもしれませんがステートメント数が減るっていうことで)
using System.Windows;
using System.Windows.Media;

class Program
{
    [System.STAThread]
    public static void Main()
    {
        Window window = new Window
            {
                Title = "WPF Window",
                Width = 300,
                Height = 300,

                Background = new DrawingBrush
                    {
                        Drawing = new GeometryDrawing
                            {
                                Brush = new RadialGradientBrush(Colors.LightGray, Colors.SlateGray),
                                Pen = new Pen(Brushes.Black, 0.1),
                                Geometry = new GeometryGroup
                                    {
                                        Children = {
                                                new RectangleGeometry(new Rect(0, 0, 1, 1), 0, 0) 
                                                }
                                    }
                            }
                    }
            };

        Application app = new Application();
        app.Run(window);
    }
}

wpfWindowCreatedByObjectInitializer.JPG

同じ事をObject Initializer無しでやろうと思ったらこうなります:
ごちゃごちゃしており、読む気がなくなってしまいます。
一部を「メソッドの抽出」してもいいのですが、
いずれにせよ頭にかかる負担は増えてしまいます。

using System.Windows;
using System.Windows.Media;

class Program
{
    [System.STAThread]
    public static void Main()
    {
        Window window = new Window();
        window.Title = "WPF Window";
        window.Width = 300;
        window.Height = 300;

        DrawingBrush brush = new DrawingBrush();
        GeometryDrawing drawing = new GeometryDrawing();
        GeometryGroup geometry = new GeometryGroup();

        geometry.Children.Add(
            new RectangleGeometry(new Rect(0, 0, 1, 1), 0, 0)
            );

        drawing.Geometry = geometry;
        drawing.Brush = new RadialGradientBrush(Colors.LightGray, Colors.SlateGray);
        drawing.Pen = new Pen(Brushes.Black, 0.1);
        brush.Drawing = drawing;
        window.Background = brush;

        Application app = new Application();
        app.Run(window);
    }
}


ここで一番最初のサンプルの方を見ると美しさに息を呑みます!
すばらしい!!
WPFを使うときにはObject Initializerを積極的に使っていくべきでしょうね。

拍手[0回]

PR