LoginSignup
11
11

More than 3 years have passed since last update.

[WPF/xaml] Pathで描いた図形サンプル集(ひし形、角を丸くした四角、楕円など)

Posted at

やりたいこと

xamlで描いた画面の中に、図形・記号を表示したい。
それほど難しい形を出したいわけではなく、ちょっと角を丸くした四角、とか、ひし形、とかその程度でいい。

ちょっと調べた結果、「Path」を使ってやれば、自由な形を描画できそうなので、どうやったら好きな図形を描けるか調べる。

やり方

PathのDataに、図形のもととなる「コマンド」をセットしてやる。

サンプル

ひし形

image.png

ひし形.xaml
<Path Stroke="LightPink" Fill="LemonChiffon" Stretch="Fill"  StrokeThickness="3"
      Data="M 0,50 L 50,100 L 100,50 L 50,0 Z" />

三角

image.png

三角.xaml
<Path Stroke="LightPink" Fill="LemonChiffon" Stretch="Fill"  StrokeThickness="3"
      Data="M 0,0 L 100,100 L 100,0 Z"/>

扇形 その1

image.png

扇形その1.xaml
<Path Stroke="LightPink" Fill="LemonChiffon" Stretch="Fill"  StrokeThickness="1"
      Data="M 0,0 A 50,50 0 0 1 50,50 L 50,0 Z"/>

扇形 その2

image.png

扇形その2.xaml
<Path Stroke="LightPink" Fill="LemonChiffon" Stretch="Fill"  StrokeThickness="1"
      Data="M 0,0 A 50,50 0 0 0 50,50 L 50,0 Z" d:IsHidden="True"/>

楕円 その1

image.png

楕円その1.xaml
<Path Stroke="LightPink" Fill="LemonChiffon"  StrokeThickness="1"
      Data="M 0,0 A 50,25 0 1 0 50,25"/>

楕円 その2

image.png

楕円その2.xaml
<Path Stroke="LightPink" Fill="LemonChiffon"  StrokeThickness="1"
      Data="M 0,0 A 50,25 0 0 1 50,25"/>

楕円 その3

image.png

楕円その3.xaml
<Path Stroke="LightPink" Fill="LemonChiffon"  StrokeThickness="1"
      Data="M 0,0 A 50,25 0 1 1 50,25"/>

楕円 その4

image.png

楕円その4.xaml
<Path Stroke="LightPink" Fill="LemonChiffon"  StrokeThickness="1"
      Data="M 0,0 A 50,25 90 1 1 50,25"/>

四角の下の角を丸くしたもの その1

image.png

四角の下の角を丸くしたものその1.xaml
<Path Stroke="LightPink" Fill="LemonChiffon" StrokeThickness="1"
      Data="M 0,0 L 0,90 A 10,10 90 0 0 10 100 L 90,100 A 10,10 90 0 0 100,90 L 100,0 Z"/>

四角の下の角を丸くしたもの その2

image.png

四角の下の角を丸くしたものその2.xaml
<Path Stroke="LightPink" Fill="LemonChiffon" StrokeThickness="1" Stretch="Fill"
      Data="M 0,0 L 0,90 A 10,10 90 0 0 10 100 L 90,100 A 10,10 90 0 0 100,90 L 100,0 Z"/>

サンプル全体

MainWindow.xaml
<Window x:Class="WpfApp34.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp34"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="200">
    <Grid Width="120" Height="120" Background="Transparent">
        <Path Stroke="LightPink" Fill="LemonChiffon" Stretch="Fill"  StrokeThickness="3"
              Data="M 0,50 L 50,100 L 100,50 L 50,0 Z" />

        <Path Stroke="LightPink" Fill="LemonChiffon" Stretch="Fill"  StrokeThickness="3"
              Data="M 0,0 L 100,100 L 100,0 Z"/>

        <Path Stroke="LightPink" Fill="LemonChiffon" Stretch="Fill"  StrokeThickness="1"
              Data="M 0,0 A 50,50 0 0 1 50,50 L 50,0 Z"/>

        <Path Stroke="LightPink" Fill="LemonChiffon" Stretch="Fill"  StrokeThickness="1"
              Data="M 0,0 A 50,50 0 0 0 50,50 L 50,0 Z"/>

        <Path Stroke="LightPink" Fill="LemonChiffon"  StrokeThickness="1"
              Data="M 0,0 A 50,25 0 0 0 50,25"/>

        <Path Stroke="LightPink" Fill="LemonChiffon"  StrokeThickness="1"
              Data="M 0,0 A 50,25 0 1 0 50,25"/>

        <Path Stroke="LightPink" Fill="LemonChiffon"  StrokeThickness="1"
              Data="M 0,0 A 50,25 0 0 1 50,25"/>

        <Path Stroke="LightPink" Fill="LemonChiffon"  StrokeThickness="1"
              Data="M 0,0 A 50,25 0 1 1 50,25"/>

        <Path Stroke="LightPink" Fill="LemonChiffon"  StrokeThickness="1"
              Data="M 0,0 A 50,25 90 1 1 50,25"/>

        <Path Stroke="LightPink" Fill="LemonChiffon" StrokeThickness="1"
              Data="M 0,0 L 0,90 A 10,10 90 0 0 10 100 L 90,100 A 10,10 90 0 0 100,90 L 100,0 Z"/>

        <Path Stroke="LightPink" Fill="LemonChiffon" StrokeThickness="1" Stretch="Fill"
              Data="M 0,0 L 0,90 A 10,10 90 0 0 10 100 L 90,100 A 10,10 90 0 0 100,90 L 100,0 Z"/>
    </Grid>
</Window>

わかりにくかったところメモ

PathのDataにコマンドをセットすると、線を描画できる。
「M」がスタート地点を指定する、
「Z」は最後の描画点からスタート地点を自動で結んで閉じてくれる、
「L」が現在地点から指定の地点までの線を引く、というのは分かりやすかったが、
「A」の楕円を描く、というのがなんともわかりにくかった。

コマンド「A」について

Aの説明は、MSDOCSではこのようになっている。
https://docs.microsoft.com/ja-jp/dotnet/framework/wpf/graphics-multimedia/path-markup-syntax
image.png

sweepDirectionFlagの意味

まずわからなかったのが「sweepDirectionFlag」の意味。
実験したところ、

  • sweepDirectionFlagが1だと、開始地点から「右回り(正の方向)」に、楕円が描画される
  • sweepDirectionFlagが0だと、開始地点から「左回り(負の方向)」に、楕円が描画される。

image.pngimage.png

isLargeArcFlagの意味

さらに「isLargeArcFlag」も意味が分からなかった。
実験したところ、

  • isLargeArcFlagが1だと、開始地点から目的地まで、180度より大きい経路を通って楕円を描く
  • isLargeArcFlagが0だと、開始地点から目的地まで、180度より小さい経路を通って楕円を描く

image.pngimage.png

sweepDirectionFlag と isLargeArcFlag

sweepDirectionFlag と isLargeArcFlagが両方0、
sweepDirectionFlag と isLargeArcFlagが両方1、にして楕円を描くと、
丁度反対周りで楕円を描いたようになる。
(二つ合わせて一つの楕円のようになる)

image.png
image.png

rotationAngleの意味

rotationAngleを例えば90にすると、楕円が90度回転したようになる。
→上の「楕円その4.xaml」参照

PathのStretchについて

Pathの「Stretch」を"Fill"にしておいてやると、親のGridの大きさに合わせて書いた図形が伸長してくれるので、大体の形をPathで作っておいて、最終的に画面に収めるときはGridの大きさで微調整する、ということもできる。(ただし、上の「四角の下の角を丸くしたもの その2」でそれをやると、Gridが横長だったりすると、角を丸めた部分が横に伸びて丸まったようになる(見た目が崩れる)ので注意が必要。)

まとめ

以上のことが大体わかれば、画面にUIの部品として出すための図形くらいであれば、よっぽど奇抜なUIでなければ描けると思う。

参考

パスマークアップの構文
https://docs.microsoft.com/ja-jp/dotnet/framework/wpf/graphics-multimedia/path-markup-syntax

11
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11