1

私が取得したいのは、コントロールのコレクションをズームする方法ですが、このコントロールのサブセットの幅、高さ、および位置を維持することです。WPF のズームインとズームアウト中に要素のサイズを維持するにはどうすればよいですか?という質問を見てきました。、私が望むものに非常に似ていますが、答えられておらず、あまり明確ではないため、質問を改善します。

現在、.net Framework 4.0 用に拡張された WPF Toolkit に付属の Zoombox コントロールを使用していますが、これは変更できます。私が持っている構造は次のとおりです。

<Border x:Name="drawRegionBorder" Grid.Column="1" Grid.Row="1" d:LayoutOverrides="Width, Height" BorderThickness="1" CornerRadius="4" BorderBrush="{StaticResource BorderBrush}" >
        <xctk:Zoombox x:Name="zoomBox">
            <Grid x:Name="drawRegion" Height="{Binding Height}" Width="{Binding Width}" HorizontalAlignment="Left" VerticalAlignment="Top" Background="{DynamicResource DrawBackgroundBrush}">
                <Image Source="{Binding Image}" ... />
                <ListBox x:Name="points" ItemsSource="{Binding Points}">
                    <ListBox.Template>
                        <ControlTemplate>
                            <Canvas IsItemsHost="True"/>
                        </ControlTemplate>
                    </ListBox.Template>
                </ListBox>
                <ListBox x:Name="paths" ItemsSource="{Binding SomePaths}">
                    <ListBox.Template>
                        <ControlTemplate>
                            <Canvas IsItemsHost="True"/>
                        </ControlTemplate>
                    </ListBox.Template>
                </ListBox>
                <!--... Others ...-->
            </Grid>
        </xctk:Zoombox>
</Border>

ここにあるのは、グリッド内のいくつかのリスト ボックスで、各リスト ボックスのアイテム パネルはキャンバスであるため、各子 (ただし画像) はキャンバス内に配置され、各子はプロパティCanvas.XCanvas.Yプロパティを設定します。だから私が欲しいのは、ズーム(ズームインまたはズームアウト)を行い、ポイント(楕円)またはパスのサイズを維持する方法です...

ズームのため、wpf のスケール変換です。ズームイン時にこれを行う方法で、サイズを維持したいコントロールにズームアウトし、その逆も可能だと思います。

予想される動作の例は、ブレンド デザイナーです。たとえば、行と列を含むグリッドをズームインすると、列インジケーターは元のサイズを保持します。そのようなものが、ポイントとパスに必要なものです。

解決策、おそらくライブラリ、添付プロパティ、動作、またはコードに感謝します。ありがとう

4

2 に答える 2

1

Blend デザイナーは、マニピュレーターに Adorners を使用します。サイズは現在のズームのズームに従って計算されます。同様の手法を使用することに興味がある場合は、実際に自分で計算するのはそれほど難しくありません。

コントロールの Bounds に設定された adorner を作成し、デザイナーのズームに応じてスケール ファクターを適用します。したがって、2.0 でズームする場合、スケール 2.0 の RenderTransform をズームされたコントロールに適用し、ズームされたコントロールの ActualWidth と ActualHeight の 2.0 になるようにアドナーを計算します (これら 2 つのプロパティは RenderTransformations を考慮しないため)。良い点は、すべてが double を使用するため、この種の計算を行うときにピクセル パーフェクトな精度が得られることです。

このアプローチを使用することで、メイン コントロールをズームできるようになり、マニピュレータはズームされたコントロールに合わせて単純にスケーリングされますが、コントロール サイズは全体を通して維持されます。

このチュートリアルは良い出発点です。OnRender メソッドでは、スケーリング ファクターを適用する必要があります (UIElement の ActualWidth/Height に基づいてアドナーの境界を計算し、スケーリング ファクターを掛けることにより)。アドナーを適用する方法は、アプリケーションのコンテキストに大きく依存します。デザイナーをしている場合は、デザイン キャンバスまたはアイテムの選択時にアドナーを適用する必要があります。

于 2013-03-11T20:38:25.017 に答える
0

私は調査を行い、いくつかの有用なことを見つけました。たとえば、アドナーを使用している場合、アドナーに実行GetDesiredTransformさせたい変換を設定するためにオーバーライドできます。ここで、アドナーに行われた変換を null にすることができます. 詳細については、Adorner GetDesiredTransform メソッドで GeneralTransform から scaleTransform を除外する方法を参照してください。Msdnで。しかし、コントロールで作りたい場合は、自分で変換を制御する必要があると思います。

于 2013-03-13T21:36:26.143 に答える