頭ん中

しがないITエンジニアが、考えた事を書きます。

UWPでPathクラスのDataプロパティにSVGパスデータを指定する

UWPのPathクラスは図形を自由にレンダリングする一番基本的なクラスですが、これにSVGパスデータの文字列(M0,0 L10,30~~~みたいなやつ*1)をコードビハインドで指定する方法が解らず嵌った。

XAMLはOK、コードはNG

XAMLだと以下の指定でOK

<Path Stroke="DarkGoldenRod" 
      StrokeThickness="3"
      Data="M 100,200 C 100,25 400,350 400,175 H 280" />

しかし、残念ながらコード側でこの文字列指定は型変換エラーになる。

StrokeThickness = 3;
Data = "M 100,200 C 100,25 400,350 400,175 H 280";

エラーに従ってGeometryクラスを生成しようとするが、コンストラクタでパスデータの文字列を指定できそうな機能が無い。えぇ…。ドキュメントの通りにGeometryGroupをちまちま生成していけばいいのかもしれないけど、イラレで描いた

"M13.022,20.3 C7.223011,20.299999 2.5220008,25.001009 2.5220011,30.799998 2.5220008,36.598989 7.223011,41.299999 13.022,41.299999 18.820991,41.299999 23.522001,36.598989 23.522001,30.799998 23.522001,25.001009 18.820991,20.299999 13.022,20.3 z M13.000003,0 L15.75652,19.295632 16.248902,19.409274 C21.856449,20.852031 26.000001,25.942126 26.000001,31.999999 26.000001,38.73097 20.884504,44.267153 14.329177,44.932882 L14.03747,44.955063 16.999994,121 8.999999,121 11.963054,44.955103 11.670825,44.932882 C5.1154974,44.267153 7.1525574E-07,38.73097 0,31.999999 7.1525574E-07,25.942126 4.143553,20.852031 9.7510991,19.409274 L10.243482,19.295632 z"

こんな文字列のパスをGeometryGroupで表現するのはほぼ不可能なので、解決策を探す。

解決策

ということで最終系→無事動きました👏

Data = (Geometry)XamlBindingHelper.ConvertValue(typeof(Geometry), "M13.022,20.3 C7.223011,20.299999 2.5220008,25.001009 2.5220011,30.799998 2.5220008,36.598989 7.223011,41.299999 13.022,41.299999 18.820991,41.299999 23.522001,36.598989 23.522001,30.799998 23.522001,25.001009 18.820991,20.299999 13.022,20.3 z M13.000003,0 L15.75652,19.295632 16.248902,19.409274 C21.856449,20.852031 26.000001,25.942126 26.000001,31.999999 26.000001,38.73097 20.884504,44.267153 14.329177,44.932882 L14.03747,44.955063 16.999994,121 8.999999,121 11.963054,44.955103 11.670825,44.932882 C5.1154974,44.267153 7.1525574E-07,38.73097 0,31.999999 7.1525574E-07,25.942126 4.143553,20.852031 9.7510991,19.409274 L10.243482,19.295632 z");