私は、コントロールの実際の幅と高さに基づいてかなり高価な計算を行う必要があるアプリケーションがあります。私はこのコントロールのActualWidthとActualHeightを自分のコードのプロパティに束縛しました。 Actualheightが小さなステップで変更されていることがわかりました。私はこれがLayout Engineのためだと考えています。スケーリングジオメトリユーザーコントロールの実際の高さと幅に基づくパスは非常に遅い
Aは、XAMLのバージョンをストリップダウンViewModelにでViewportHeightまたはViewportWidthプロパティが変更されたときGridPathが私のViewModelに設定されている
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sup="clr-namespace:RowAnimation.Support"
xmlns:vm="clr-namespace:RowAnimation.ViewModels"
xmlns:System="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:RowAnimation.Views"
x:Name="RowerAnimation"
x:Class="RowAnimation.Views.RowerAnimationControl"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance {x:Type vm:RowerAnimationControlVM}}"
d:DesignHeight="497" d:DesignWidth="741">
<Grid>
<DockPanel >
<Grid Margin="5" x:Name="canvas1" ClipToBounds="True" VerticalAlignment="Top">
<sup:DataPiping.DataPipes>
<sup:DataPipeCollection>
<sup:DataPipe Source="{Binding ActualWidth, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}}"
Target="{Binding ViewportWidth, Mode=OneWayToSource}"/>
<sup:DataPipe Source="{Binding ActualHeight, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}}"
Target="{Binding ViewportHeight, Mode=OneWayToSource}"/>
</sup:DataPipeCollection>
</sup:DataPiping.DataPipes>
<Path x:Name="gridLines" Stroke="#FF6083E2" Data="{Binding GridPath, Mode=OneWay}"/>
</Grid>
</DockPanel>
</Grid>
</UserControl>
です。
ViewModelにブレークポイントを設定すると、ViewportWidthは一度変更されますが、ViewportHeightは少しずつ増分して変更されます。 GridPathを計算するメソッドをコメントアウトすると、VieportHeightブレークポイントは1回だけヒットします。 GridPathの設定が新しいレイアウト計算をトリガするように見えます。
私の実際の実装では、Gridがコントロールの下部にドッキングされているため、XAMLにDockpanelがあるのはなぜですか。
私はMVVMを使用しているので、this Stackoverflow linkからDataPipingを使用して、私のViewModelでActualHeightとActualWidthを取得します。
誰でも何が起こっているのか、どのように回避しているのでしょうか?それはGridPathの設定です(実際には実際の実装ではPathGeometriesをもっと使用しています)ので、ウィンドウのサイズ変更に8秒以上かかることがあります。また
:
フム、私が十分なジオメトリを理解していないようです。ここで私は、グリッドを埋めるために使用するコードは次のとおりです。
private void PopulateGrid()
{
PathGeometry path = new PathGeometry();
Rect rect = new Rect(converter.NormalizePoint(xMin, yMin), converter.NormalizePoint(xMax, yMax));
RectangleGeometry border = new RectangleGeometry(rect);
path.AddGeometry(border);
for (double y = 0; y < yMax; y += 30) {
LineGeometry line = new LineGeometry(converter.NormalizePoint(xMin, y), converter.NormalizePoint(xMax, y));
path.AddGeometry(line);
}
GridPath = path;
}
私は最初の4行をコメントアウトすると、その後ActualHeightが設定されていないと私は私のユーザーコントロールには、グリッドを参照してくださいません。矩形はレイアウトエンジンを動作させますが、LineGeometryは動作しません。
xMin、yMin、xMaxおよびxMinはワールド座標にあり、NormalizePointは現在のViewportWidthおよびViewportHeightに基づいてそれらをスクリーン座標に変換します。
ここでは何をしようとしているのか分かりませんので、これは当てはまりませんが、コントロールのサイズに合わせてパスを拡大するには、単に 'ViewBox'の中に入れてください。それはあなたのためのすべてのスケーリングと再描画を自動的に処理します。 –
ViewBoxは、線の太さを含むすべての線を拡大/縮小します。私はそれを望んでいない。それでも私が別の解決法を得ることができなければ、それを試してみたいかもしれません。 –
hmm .. 'Path'の代わりに' Geometry'を使うことができます。レンダリング変換を 'Geometry'に適用すると、線種がスケーリングされていない別の' Pen'によって指定されているので、座標をスケーリングします。しかしそれはもっと複雑になり始める。 –