前回に続き、別の方法でWPFでグリッド状の模様を書く方法を考えてみる。
次に思いついたのはUserControlのOnRenderをオーバーライドする方法であった。
この方法は、感覚がなんとなくWindowsFormsのOnPaintをオーバーライドする方法に似ている。
UserControlのソースコードは以下のように書いてみた。
MyGridView2.xaml.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace MyGridLesson2 { /// <summary> /// MyGridView2.xaml の相互作用ロジック /// </summary> public partial class MyGridView2 : UserControl { private const int GRID_SIZE = 20; public MyGridView2() { InitializeComponent(); } protected override void OnRender(DrawingContext drawingContext) { Pen pen = new Pen(Brushes.Gray, 1.0f); for (int i = 0; i < this.ActualWidth; i += GRID_SIZE) { drawingContext.DrawLine( pen, new Point(i, 0), new Point(i, this.ActualHeight)); } for (int i = 0; i < this.ActualHeight; i += GRID_SIZE) { drawingContext.DrawLine( pen, new Point(0, i), new Point(this.ActualWidth, i)); } base.OnRender(drawingContext); } } }
そして、メインウィンドウのxamlでは上で作ったユーザーコントロールを配置しているだけである。
MainWindow.xaml
<Window x:Class="MyGridLesson2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:my="clr-namespace:MyGridLesson2" Title="MainWindow" Height="350" Width="525" RenderOptions.EdgeMode="Aliased" SnapsToDevicePixels="True"> <Grid> <my:MyGridView2> </my:MyGridView2> </Grid> </Window>
ここまでで実行すると以下のように表示される。
ただ、頻繁にウィンドウサイズを変更していたりすると、時々描画内容がおかしくなることがある。
下の画像のように、一部の線が太くなったりしてしまうのである。
もっとも、私の環境がWindowsXPだからということもあるのかもしれないが、
やや割り切れない感が残った。
追記:
MainWindow.xamlの6行目でRenderOptions.EdgeMode=”Aliased”の記述を削除するとこの事象は起こらないようだ。
ただし、ぼやけた感じの線になってしまう。
ピンバック: 【WPF】グリッド状の模様を書く その(3) DrawingBrushを使う – ザワプロ!