2012-01-09 5 views
0

だから、私はWPFのスケーリングを理解していないか、すべての解決策があまりにも複雑です。バックグラウンドは、私は親UserControlとその子をスケールする必要があります。同時に、あまりにもスマートな私のXAMLを避けようとしています。だから、私はWPFでのスケーリングに別の(より簡単な)アプローチをしようとしています。WPFスケーリングの異なるアプローチ:DesignPropertiesへのアクセス?

まず、SizeChangedイベントを登録します。新しいサイズと前のサイズ(両方ともイベントパラメータから提供される)から、幅と高さの比率を計算し、それを各子要素に適用してサイズを変更します。シンプルに聞こえる。ただし、UserControlが実際に生成されると、SizeChangedイベントが初めて発生します。この時点で、「古い」高さと幅は両方とも0(またはNaN)です。

private void ScaleElement(FrameworkElement element, 
     double previousWidth, double previousHeight, 
     double newWidth, double newHeight) 
    { 
     double scalingFactorX; 
     double scalingFactorY; 

     scalingFactorX = newWidth/previousWidth; 
     scalingFactorY = newHeight/previousHeight; 
     double elementRelativePosX = element.Margin.Left/previousWidth; 
     double elementRelativePosY = element.Margin.Top/previousHeight; 

     element.Margin = new Thickness(newWidth * elementRelativePosX, newHeight * elementRelativePosY, 0, 0); 
     element.Width *= scalingFactorX; 
     element.Height *= scalingFactorY; 
    } 

私は非existant「古い」のサイズを変更することで、この最初の発射イベントを処理したいと思います:;(NaNのに問題があることを無視して単純化)ここで

は、私は、現時点でそれを行う方法ですデザイン時に意図されたUserControlのサイズを使用します。私は間違っている可能性がありますが、XAMLはDesignProperties.DesignWidth(XAML:例えばd:DesignWidth = "300")という静的プロパティを示します。どういうわけかこれにアクセスできますか?そうでない場合は、プログラム的に問題を解決する(または一般的にスケーリングする)別の方法がありますか?前もって感謝します。

+0

は、あなたが本当に(すなわち、フォントサイズをdescresing /増加など)をスケールするかをまたはちょうどあなたのコントロールのサイズを変更? – kev

+0

スケール - UserControlの子コントロール。 – RolandK

答えて

1

あなただけ比例してコンテンツのサイズを変更したい場合は、ViewBoxを試し与えたいと思うことがあります。 http://wpftutorial.net/ViewBox.html

+0

面白いことに、これは私がそれを解決した方法でした。私はプログラマチックなアプローチに集中しすぎた。それは間違いでした!私は、WinFormsでできる限り簡単にプロパティにアクセスしてプロパティを変更できると仮定しました。残念ながら、できません(例:DesignProperties)。そこで私は、ViewBoxに配置したGridにWPFコントロールを配置することで比例スケーリングを実現しました。それは仕事をした。どうもありがとう。 – RolandK

1

d:DesignWidth/Heightプロパティは、デザイン時のみ使用するため、実行時にはアクセスできません。

私はあなたの質問に対する最良のアプローチは不明ですが、ActualWidth/ActualHeightプロパティが役立つかもしれません。または、適切なコンテナとサイジング(例えば、*サイズのグリッドセル、DockPanel.LastChildFill = trueなど)を使用することで、スケーリングをまったく使用する必要はありません。WPFはこれを多く行うことができます。明示的なスケーリングは、ビットマップイメージや一時的なサイズ変更などの場合に多くなります。

+0

あなたの助言をありがとう。私は、ActualWidth/ActualHeightがWinFormsのSizeと同様に動作することを期待していました。残念ながら、コントロールの作成時には両方とも0を返します。それらのデザイナーの価値を得る可能性はないようです。 – RolandK

1

私が正しく理解していれば、利用可能なスペースが変わるたびに、いくつかのusercontrol(コンテナ)内の複数のアイテムの適切なサイズと位置を決定する必要があります。通常、これは、適切なレイアウトパネル、つまりStackPanel、WrapPanel、DockPanel、Grid、Canvasを選択するだけです。

標準の実装が必要でない場合は、関数 'ArrangeOverride 'と' MeasureOverride '(Tutorial here)。次に、このレイアウトパネルをUserControlで使用できます。 WPFは「コンポジットコントロール」を使用して刺激する傾向があります。つまり、CustomPanelからUserControlを派生させるのとは対照的に、ControlTemplateまたはXaml(あなたの友人になることを望んでいる)でCustomPanelを使用する必要があります。

+0

あなたのヒントやご指摘いただきありがとうございます。私はチュートリアルを試しましたが、もう一度、スケーリングのような単純な作業では、コードと作業が非常に必要であるとは思いません。とにかくありがとう。たぶん私はもう一度それを与えるだろう。 – RolandK

関連する問題