2017-12-12 7 views
0

私のアプリケーションで使用しているアイコンは非常にたくさんあります。Xamlを必要とする必要があります。長いPathGeometry "Figures"属性文字列をXML構文に変換します。

<PathGeometry x:Key="RunPathGeometry" 
       Figures="M56.11 46.17 69.2 33.09a25.29 25.29 0 1 0 4.41 27H85.16l.1 0q-.25.91-.57 1.8A36.32 36.32 0 1 1 77 25.3l8.92-8.92V46.17Z" 
       FillRule="NonZero" 
       /> 

は今、これはうまく動作しますが、これらのアイコンの一部は長い間とても複雑で、属性の文字列です:私はこのように、属性構文で指定された数値を持つオブジェクトPathGeometryをでXAMLリソースディクショナリでそれらを持っています私は文字通り30,000列以上のテキストを持っています。

それは私にライン代わりののトンを与えるだろう理由だけであれば、私は非常に多くが、これらのプロパティの構文で表現していることを好むだろう。私は一緒に暮らすことができます(そして、確かに30,000以下の数になるでしょう...)

誰かが知っている単純な方法/コンバータはありますか? PathGeometryに1つのフォーマットで貼り付けて、別のフォーマットでそれを取得できる場所はどこですか?私はそうXamlReader/XamlWriterで1を自分で書くことができますが、私はむしろ車輪の再発明し、誰かがすでに持っている場合は、これを行うには、すべてのサイクルを燃やしていないだろうように見えるのドキュメントをスキミング

...

を編集 - - 誰かが尋ねて以来、 "Property"構文が意味するのは、数字が属性ではなく閉じたXMLタグで表現されるところです。以下、この例のようなもの(それは、単純な三角形例えば、実際のですが、より複雑な形状が同様に表現することができる。)

<Path Stroke="Black" StrokeThickness="1"> 
    <Path.Data> 
     <PathGeometry> 
      <PathGeometry.Figures> 
       <PathFigureCollection> 
        <PathFigure IsClosed="True" StartPoint="10,100"> 
         <PathFigure.Segments> 
          <PathSegmentCollection> 
           <LineSegment Point="100,100" /> 
           <LineSegment Point="100,50" /> 
          </PathSegmentCollection> 
         </PathFigure.Segments> 
        </PathFigure> 
       </PathFigureCollection> 
      </PathGeometry.Figures> 
     </PathGeometry> 
    </Path.Data> 
</Path> 
+1

「プロパティ構文」とは –

+0

各内部要素は閉じたxmlタグで表されます。私はPathFigureCollectionタグを含むPathGeometryタグを持っています.PathFigureタグにはそれぞれPathSigment.Segmentsタグが含まれ、LineSegmentタグ(またはArcSegment、BezierSegmentなど)を含むPathSegmentCollectionTagが含まれています。冗長ですか?間違いなく – Joe

答えて

1

は、私たちは、リソースディクショナリでこれらの束を持っているし、我々は非常に満足していますそれに:

<PathGeometry x:Key="SearchGlyphPathGeometry" x:Shared="True" FillRule="EvenOdd"> 
    <PathGeometry.Figures> 
     M 25,13 
     A 12,12, 0,1,1, 13,25 
     A 12,12, 0,0,1, 25,13 
     Z 
     M 35.8,41.8 
     A 20,20, 0,0,1, 5,25 
     A 20,20, 0,1,1, 41.8,35.8 
     L 57,51 
     L 51,57 
     Z 
    </PathGeometry.Figures> 
</PathGeometry> 

そうのように使用します。

<Path Data="{StaticResource SearchGlyphPathGeometry}" Fill="DeepSkyBlue" /> 

Perlを使用するのに十分な単純なものか、パス文字列内のすべての英字の前に改行を挿入するためにsedのでしょう。やC#:

var re = new Regex("([a-z])", RegexOptions.IgnoreCase); 
var s = re.Replace(PathGeometryText, "\n\t\t\t$1"); 

あなたは、再帰的にXAMLファイルのためのプロジェクトディレクトリを検索するためのコードを記述PathGeometry要素を探し、上記の正規表現でFigures属性値を変換することができ、属性を削除し、代わりに子要素を追加します。

<PathGeometry x:Key="RunPathGeometry" FillRule="NonZero"> 
    <PathGeometry.Figures> 

     M56.11 46.17 69.2 33.09 
     a25.29 25.29 0 1 0 4.41 27 
     H85.16 
     l.1 0 
     q-.25.91-.57 1.8 
     A36.32 36.32 0 1 1 77 25.3 
     l8.92-8.92 
     V46.17 
     Z 
    </PathGeometry.Figures> 
</PathGeometry> 

また、do something about that mildly annoying orphan newline正規表現をテキストの前に置いておきます。

元の考えでは、PathGeometryのインスタンスを文字列からインスタンス化してXAMLとしてシリアル化することができますが、上記のように少なくとも私は読み取り可能であると思われます。

+0

おかげで、これは基本的に私がやろうとしていることです。私は、 "Figure"タグの中に改行で区切られた生の値として、パスフィギュアの構文を埋め込むことができるかどうかはわかりませんでした。私はそれが1行で引用符で囲まれた文字列でなければならないと考えました。これは読みやすさを大幅に簡素化します。しかし、まだ私に質問が残っています:どのように私は30,000文字のパスの図の文字列をこのようなものに変換するのですか?私はただ一つのアイコンしか持っていなくても、手動でやりたいとは思わないでしょう!もう一度、私はそれを書くことができると確信しています、私は誰かがすでに持っていたと思っていた... – Joe

+1

@ジョー更新を参照してください –

+0

あなたの助けをありがとう。 Sedと正規表現は、私が本当に習得したいと思っているものの一つですが、決して時間がありません。私はいつも自分の仕事を終わらせて他のものに移すだけのことを学びます。私は最後の1時間をSedと闘い、正しい選択肢を得て、同様に機能するものを手に入れました。これは私のsedスクリプトです:仕事をしているようです s /([MmLlHhVvCcQqSsTtAa])/ [編集] – Joe

関連する問題