0

DrawingContextコントロールの左上隅ではないものに関連するものをWPFで描画する方法を考えていました。私の問題は、さまざまなドットを接続していくつかの形状を描画したいということです。これらのドットは、Y が上向きになるように、ホスト コントロールの中心に対して配置する必要があります。

私の要素はカスタムDrawingVisualサブクラスのツリーを使用してレンダリングされ、ルートBorderVisualCollection. Y 方向の問題は、 aScaleTransformをその として指定RenderTransformBorder、基本的にコントロール全体を垂直方向に反転することで解決しました。

ただし、他の問題についてはそのような運はありません。私の起源を中心に置く方法について何か考えはありますか?

4

3 に答える 3

1

ScaleTransform の代わりに、y 方向に -1 ずつスケーリングし、座標原点をコントロールの中心に変換する MatrixTransform を使用できます。ただし、この変換は、コントロールのサイズが変更されるたびに更新する必要があります。RenderTransformしたがって、以下のように OnRenderSizeChanged をオーバーライドします (コントロールのプロパティを設定すると仮定します)。

protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
    base.OnRenderSizeChanged(sizeInfo);

    RenderTransform = new MatrixTransform(1d, 0d, 0d, -1d,
        sizeInfo.NewSize.Width / 2d, sizeInfo.NewSize.Height / 2d);
}

編集: コントロール全体を変換したくない場合は、MatrixTransform をクラス メンバーとして定義し、ビジュアルの子コレクション内のすべての Visual に適用することもできます。

private MatrixTransform transform = new MatrixTransform();

すべての新しいビジュアルの Transform プロパティに割り当てます。

ContainerVisual visual = ...
visual.Transform = transform;

サイズを変更すると、MatrixTransform を更新するだけです。

protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
    base.OnRenderSizeChanged(sizeInfo);

    transform.Matrix = new Matrix(1d, 0d, 0d, -1d,
        sizeInfo.NewSize.Width / 2d, sizeInfo.NewSize.Height / 2d);
}

もちろん、Transform を「トップレベル」のビジュアルに適用するだけで済みます。これらのビジュアルの子は、親の変換によって変換されます。「VisualCollection を含む Border サブクラス」でビジュアルを管理する方法が正確にはわかりません。典型的なアプローチは、1 つの親 ContainerVisual をビジュアル ツリーのルートとして持つことです。変換は、このルート ビジュアルのみに適用されます。

于 2012-10-23T07:31:15.853 に答える
0

TranslateTransformを試しましたか?

于 2012-10-23T03:50:05.583 に答える
0

わかりました。これが私がやった方法です。

まず、 を定義し、サブクラスのプロパティにGroupTransform割り当てました。WorldTransformBorder

var trans = new TranslateTransform();
var conv = new HalfConverter(); // a custom converter that halves whatever you pass to it
BindingOperations.SetBinding(trans, TranslateTransform.XProperty, new Binding { Path = new PropertyPath(ActualWidthProperty), Source = this, Converter = conv });
BindingOperations.SetBinding(trans, TranslateTransform.YProperty, new Binding { Path = new PropertyPath(ActualHeightProperty), Source = this, Converter = conv });

WorldTransform = new TransformGroup();
WorldTransform.Children.Add(new ScaleTransform { ScaleY = -1.0 });
WorldTransform.Children.Add(trans);
VisualTransform = WorldTransform;

次に、 custom の新しいインスタンスを作成するときに、そのプロパティを myDrawingVisualに割り当てます。TransformWorldTransform

// ZoneVisual is my DrawingVisual subclass
var vis = new ZoneVisual(zone) { Transform = WorldTransform };

新しい要素 (ちなみに a ) を追加するときはNode、単に my の逆に変換する必要がありますWorldTransform

出来上がり。これは最善の方法ではないかもしれませんが、かなりうまくいくようです。私は非常に高いパフォーマンスのニーズを持っていないので、おそらくそれでうまくいくでしょう.

于 2012-10-25T00:52:02.653 に答える