1

WinForms アプリの WPF ホスト コントロールにドッキングされた WPF コントロールがあります。WPF コントロールは水平方向と垂直方向の両方に拡大するように設定されており、ホスト コントロールは固定されたグループ ボックスにドッキングされています。

私の WPF コントロールには、Canvas から派生したカスタム クラスである子を配置するために使用するスペースを埋める Canvas があります。

メインのキャンバスの SizeChanged イベントをサブスクライブし、スケール変換を適用して、コントロールのサイズが変更されたときにキャンバスとその子がズームのように縮小および拡大するようにしましたが、何らかの理由で親キャンバスが縮小しています子よりもはるかに高いレートで、スケール レートのために特定のポイントで子がキャンバスから外れます。

これは私のコードです:

    private void EditorCanvas_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        if (e.PreviousSize.Width == 0)
            return;
        double YDiff = e.PreviousSize.Height / e.NewSize.Height;
        double XDiff = e.PreviousSize.Width / e.NewSize.Width;

        Scale.ScaleY /= YDiff;
        Scale.ScaleX /= XDiff;
    }

キャンバスの子は正しいレートでスケーリングしているように見え、キャンバスははるかに高いレートでスケーリングしているようです。

誰かが理由を見たり、これが起こっている理由を知っていますか?

動作の写真...小さいパネルの後ろの空白に注意してください

画像

スケーリング 画像

4

2 に答える 2

5

これ:

メインのキャンバスの SizeChanged イベントをサブスクライブし、スケール変換を適用して、コントロールのサイズが変更されたときにキャンバスとその子がズームのように縮小および拡大するようにしましたが、これは機能していますが、何らかの理由で親キャンバスが縮小しています子よりもはるかに高いレートで、スケール レートのために特定のポイントで子がキャンバスから外れます。

が行うことViewboxです。aViewboxを WPF ビジュアル ツリーのルート要素として配置します。そのStretchプロパティをニーズに合ったものに設定します。そのサイズ計算をすべて削除します。WPF はサイズ計算を必要としません。

于 2013-03-11T17:48:26.363 に答える
1

いくつかの中間ステップ (つまり、いくつかのサイズ変更) が抜けているようです。アプリケーションがサイズ変更イベントを十分な速度で処理できない場合、Windows は追いつくために途中でいくつかをスキップしている可能性があります。

たとえば、アプリが 1000 の高さで開始されたとします。その後、すぐに 100 に変わりますが、その過程でいくつかの中間サイズ (500、250、125) を通過します。それらの 1 つまたは 2 つを見逃した場合、ScaleY の計算で次のような結果になります。

0. Height = 1000; ScaleY = 1
1. Height: 1000 > 500; ScaleY = 1/(1000/500) = 0.5
2. [misses 250]; no scaleY adjustment
3. Height: 250 > 125; ScaleY = 0.5 / (250/125) = 0.25  // when it should actually be .125
4. Height: 125 > 100; ScaleY = 0.25 / (125/100) = 0.2  // when it should actually be 0.1

代わりに、元のサイズを保存して使用し、連続微分の代わりに絶対値を計算する必要があります..

于 2013-03-11T17:33:35.983 に答える