質問
拡張可能なパネルを備えた WPF ウィンドウがあります (経由) Expander
)。パネルはウィンドウの左側にあり、展開すると、ウィンドウはコンテンツに合わせて拡大されます。
デフォルトでは、ウィンドウは左上に固定されているため、ウィンドウは右に向かって拡大します。ウィンドウを左側に拡大したいと思います。
で次のことを実行しようとしました Window.SizeChanged
イベント:
private void onWindowSizeChanged(object sender, SizeChangedEventArgs e)
{
Left -= (e.NewSize.Width - e.PreviousSize.Width)
}
それは機能しますが、成長がぎくしゃくしているので、よりスムーズな解決策を見つけたいと思っています。
解決
私は、これは簡単な解決策を使用して克服するために管理:隠す&ショー
ここでコードがあります:
protected override void OnRenderSizeChanged(SizeChangeInfo sizeInfo)
{
if (!sizeInfo.WidthChanged)
{
base.OnRenderSizeChanged(sizeInfo);
return;
}
Hide();
base.OnRenderSizeChanged(sizeInfo);
Left -= (sizeInfo.NewSize.Width - sizeInfo.PreviousSize.Width);
Show();
}
私はWindow.SizeChanged
のこのオーバーライドでFrameworkElement.OnRenderSizeChanged
のイベントハンドラを置き換えます。
他のヒント
あなたが要求しているようにウィンドウを左に拡大させることは試していませんが、他のすべてが失敗した場合は、展開ボタンのように見えるようにボタンをテンプレート化することを検討します。次に、ウィンドウを左に拡大しようとする代わりに、変換を使用して新しいウィンドウをプライマリ ウィンドウの左側に拡大します。
アップデート
レンダリング パフォーマンスの低下は、ビデオ カード、レイアウト (過度に複雑)、またはその両方に関連している可能性があります。あなたに役立つかもしれないアイデアがあります。Jeff Prosise は、 WriteableBitmap
望ましい効果を達成するために。私は、「WriteableBitmap を使用して、Expander の右側にレイアウトのスクリーンショットを作成し、他の要素をそれで覆ってみたらどうでしょうか?」と考えました。これを実行して、基礎となる要素を非表示にすると (調整されないように)、レンダリングのパフォーマンスが大幅に向上すると思います。
Jeff のコードを少し変更するだけで WPF で動作するようになりました。
解決策 1
Window プロパティを使用してみます。SizeToContent="width" これにより、コンテンツのサイズに合わせてウィンドウが拡大縮小され、アニメーションとイージングを使用してコンテンツを拡大縮小できます。これにより、ウィンドウの拡大縮小が適切かつスムーズになります。
解決策 2
内容よりも大きなウィンドウを作成し、背景を透明にすることができます。いくつかの要素に背景を追加する必要があります。
以下にその例を示します。
あなたが左に設定し、その後、あなたのエキスパンダーのExpandDirectionプロパティを(列のサイズを変更することができます)グリッドであなたのエキスパンダーを入れてあります?