スケルトン変換をシェイプに適用するときに、誰かがWPFシェイプレンダリングのデフォルトの動作をオーバーライドできるかどうかは疑問です。デフォルトの振る舞いでは、ストロークを含むシェイプ描画全体が変換されますが、ジオメトリの縮尺を変更したいだけです。難しいのは、私のシェイプが異なるレベル(2Dシーングラフのようなものですが、WPFビジュアルツリーのようなもの)にレンダリング変換を適用したビジュアル階層に存在することです。これは変更できません(!)。私はさまざまな場所で、レンダリングトランスフォームのトランスフォームを取り消し、代わりにジオメトリに配置するカスタムシェイプを作成することが可能であると読んでいます。ストロークに影響を与えずにWPFシェイプのジオメトリスケーリング
明確に明らかなようにpublic sealed class MyPath : Shape
{
// This class has a Data property of type Geometry just like the normal Path class
protected override Geometry DefiningGeometry
{
get
{
Geometry data = Data;
if (data == null)
{
data = Geometry.Empty;
}
return data;
}
}
protected override void OnRender(DrawingContext drawingContext)
{
Transform tr = RenderedGeometry.Transform;
Geometry geomToDraw = RenderedGeometry.Clone();
geomToDraw.Transform = new MatrixTransform(tr.Value * tr.Value);
Matrix trInv = tr.Value; trInv.Invert();
drawingContext.PushTransform(new MatrixTransform(trInv));
drawingContext.DrawGeometry(Brushes.Transparent, new Pen() { Brush = Brushes.Black, Thickness = 1 }, geomToDraw);
}
}
、私はこれに非常に新しいですし、上記のコードは、おそらく完全に台無しにされています。現時点では私のようなものを持っています。私は最終的に得られるジオメトリ変換を変更せずに行列をジオメトリに転送しようとしていました。したがって、tr.Value * tr.ValueとtrInv。しかし、それは私が望むように動作しません。私はこのトランスフォーム変換技法が理論的には動作することを知っています。(Geometry.Transformをxで4倍にスケールし、0.25倍でスケールxにトランスフォームをプッシュするテストを行いましたが、結果のシェイプ描画は適用されませんでしたストレッチ=塗りつぶし、私は頼りにしている)。だから私はレンダリング変換に欠けているものがなければなりません。
動作していないテストシナリオはこれです:
- 私はレンダリングスケールはXAMLでscaleXプロパティ= 4とscaleY = 1で変換を適用します。
- 組み込みのPathクラスは、y方向よりもx方向の幅が4倍大きくなるように図面全体を拡大/縮小します。
- 私はMyPathにストロークではなくジオメトリのみを拡大縮小します。 < - これは動作していません!
- 何が起こるか:ジオメトリは正確にスケールされ、ストロークはx方向に4倍、y方向に4倍にスケーリングされます。なにが問題ですか? RenderedGeometry.Transformだけで作業するべきではないという気持ちがありますが、代わりに何を使うべきですか?私は、レンダリングトランスフォームとstretch =を塗りつぶすことが必要です。私のレンダートランスフォーム階層には、スケール、回転、および翻訳が混在している場合があります。そのため、ソリューションは、軸に沿ったスケーリングだけでなく、あらゆる変換を処理するのに十分一般的でなければなりません。
注:私はOnRenderのジオメトリを作成するために悪いです知っているが、私はそれをクリーンアップの時間を費やす前に作業を取得したいです。ところで
、私はこの記事をお読みください。
Invariant stroke thickness of Path regardless of the scale
問題を前に述べたように、私は考慮にトランスフォームをレンダリング取らなければならないと私は、そのソリューションを適応する方法を確認していないということですそれらと一緒に働く。