質問
を実装する必要があります Canvas
サイズに応じて内容を拡大縮小します。あることは知っています Viewbox
, 、その中のすべてをスケールします。ただし、一部の要素はサイズが固定されており、拡大縮小できないため、それを使用することはできません。
また、サイズをバインドするにはどうすればよいですか Canvas
親要素 (サイズ変更可能なウィンドウなど) に追加します。ウィンドウにはsizeToContentがありますが、サイズをまったく逆に合わせたいのです。また、キャンバスはホスト要素のサイズに基づいて描画を使用します。再描画はどのようにトリガーされ、有効な (または最小の) サイズを取得した場合にのみ描画されるようにするにはどうすればよいですか?
解決
キャンバスに幅または高さを指定しない場合、利用可能なすべてのスペースが自動的に使用されます。これはデフォルトだからです VerticalAlignment
そして HorizontalAlignment
に設定されています Stretch
.
一部のコンテンツは固定サイズであるため、すべてのコンテンツを拡大縮小するのではなく、そのサイズに応じてコンテンツを拡大縮小するキャンバスとは何を意味しますか?
コメント後に更新
描画アルゴリズムがすでにコンテンツをキャンバスの高さと幅に合わせて拡大縮小している場合、必要なのは領域に合わせてキャンバスのサイズを変更することだけだと思います。その場合は、ハードコーディングされた高さ/幅の値を削除するだけで、キャンバスのサイズがコンテナに合わせて変更されます。
ただし、この後の描画アルゴリズムでは、Height/Width の代わりに ActualHeight/ActualWidth を使用する必要がある場合があります。ActualHeight/ActualWidth は、レイアウト コンテナーがキャンバスに与える値を返すため、これらはキャンバスの描画に使用される値を表します。
他のヒント
私のロンドン地下鉄のデモ。
これをメモリから実行していますが、WindowがControlTemplate(ContentPresenterが存在する)の一部としてPanelまたはCanvasを正しく使用している場合、つまり、Windowに直接配置されたCanvasは他の場所のように自動的にサイズ変更する問題。これに対処する基本的な方法がいくつかあります。
1使用するWindowの新しいControlTemplateを作成します。 :(
2ウィンドウ内のキャンバスではなく、ウィンドウにコンテンツを直接配置します。:/
3名前によるバインドを行います。 :)
<MyWindow x:Name="topWindow">
<Canvas x:Name="topCanvas" Width="{Binding ElementName=topWindow, Path=ActualWidth}" Height="{Binding ElementName=topWindow, Path=ActualHeight}">
...Content...
</Canvas>
</MyWindow>
(たまたま、この方法でCanvas内にグリッドをバインドすることが多いため、あるグリッド位置から別のグリッド位置に移動するアイテムを簡単にアニメーション化できます。)