Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

1つの図形を共有して敷き詰める

アプリ実行


ソースコード

App.xaml
<Application x:Class="HelloWorld.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
</Application>
MainWindow.xaml
<Window x:Class="HelloWorld.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Rectangle Name="rect" />
</Window>
MainWindow.xaml.cs
using System.Windows;
using System.Windows.Media;

namespace HelloWorld {
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();

            // 全ての描画で共有する四角形
            GeometryDrawing toShare = new GeometryDrawing(
                                        Brushes.Yellow,
                                        null,
                                        new RectangleGeometry(new Rect(4, 4, 30, 30)));

            DrawingGroup main = new DrawingGroup();

            // 1つ目の四角形
            DrawingGroup a = new DrawingGroup();
            a.Children.Add(toShare);
            a.Transform = new TranslateTransform(0, 0);

            // 2つ目の四角形を少しずらす
            DrawingGroup b = new DrawingGroup();
            b.Children.Add(toShare);
            b.Transform = new TranslateTransform(16, 16);

            main.Children.Add(b);
            main.Children.Add(a);

            // 2つの四角形を敷き詰める
            DrawingBrush brush = new DrawingBrush();
            brush.Drawing = main;
            brush.Viewport = new Rect(0, 0, 20, 20);
            brush.ViewportUnits = BrushMappingMode.Absolute;
            brush.TileMode = TileMode.Tile;

            rect.Fill = brush;
        }
    }
}

参考

GeometryDrawing クラス (System.Windows.Media)
指定した Brush および Pen を使用して、Geometry を描画します。

Geometry クラス (System.Windows.Media)
この抽象基本クラスから派生するクラスは、幾何学図形を定義します。 Geometry オブジェクトは、2-D グラフィックス データのクリッピング、ヒット テスト、およびレンダリングに使用できます。

DrawingGroup クラス (System.Windows.Media)
1 つの描画として操作できる描画のコレクションを表します。

TranslateTransform クラス (System.Windows.Media)
2-D の x-y 座標系内にあるオブジェクトを変換 (移動) します。