私はWPFユーザーコントロールを作成しましたが、その一部には、キャンバスの高さに影響を与える要素をキャンバスに動的に追加することが含まれます。キャンバスはグリッド内にネストされています。要素を動的に追加すると、キャンバスの高さが変わりますが、コントロールのサイズが変更されて背が高くなるのではなく、コントロール全体の端を超えてキャンバスが伸びてしまいます。コントロールのサイズを正しく変更するにはどうすればよいですか? Measure または Arrange を呼び出すかオーバーライドする必要があると感じていますが、どちらのメソッドでもうまくいきません。おそらく、間違ったパラメーターでそれらを呼び出しているか、呼び出すメソッドが正しくないためです。
4 に答える
問題は、Canvasパネルがコンテンツに合わせてサイズ変更されないことです。
あなたは測定と配置を参照しました。WPFの2パスレイアウトシステムに精通していますか?詳細については、この記事をお読みください:WPFのレイアウトシステム。
この記事では、さまざまなパネルがレイアウトに対して行うことについても説明します。パネルの種類はそれぞれ異なります。
WPFでは、要素には最初に、要素のサイズを決定する機会が与えられます。パネルは、お子様のサイズに基づいてサイズを決定することも、お子様のサイズに関係なく固定サイズを要求することもできます。Canvasは後者の例です。
次に、要素のサイズが通知され、要素とその子を配置するように求められます。
グリッドパネルタイプは、行と列を許可するだけでなく、コンテンツの自動サイズ設定にも非常に優れています。
StackPanelタイプは、方向付けられているディメンションではまったく自動サイズ設定されませんが、他のディメンションでは自動サイズ設定されます。
Canvasは、スペースを埋めるために自動サイズ変更できますが、子が自動サイズ変更できるようにすることはできません。指定された座標で子を描画し、子の大きさは気にしません。
行/列が1つしかないグリッドを試すことをお勧めします。
または、より優れた自動サイズ設定機能を備えた新しいCanvasクラスを作成することもできます。測定中に、子要素を測定し、それに応じてキャンバスのサイズを設定する必要があります。このようなクラスは、将来的に役立つかもしれません。
これは、WPFの自動レイアウトに関する記事です。
カスタムパネルを作成する場合は、そのサブトピックがあります:カスタムパネル要素。
編集:もう1つ:子要素の幅/高さをキャンバスのActualWidthプロパティとActualHeightプロパティにバインドして、子が親のサイズを調整できるようにすることもできます。必要に応じて、コンバーターを使用してサイズ比を設定できます。
すべて (カスタム コントロールのコンテンツ) を Viewbox にラップしようとしましたか? 例えば
<UserControl>
<Border BorderBrush="Black" BorderThickness="1">
<Viewbox>
<Grid>
<TextBlock Name="txtDefault" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="16" Foreground="Black" Opacity="0.5" Text="Default" />
<TextBlock Name="txtValue" FontSize="16" Foreground="Black" Visibility="Collapsed" />
<TextBlock Name="txtKey" Grid.Column="1" FontSize="18" Foreground="Black" Visibility="Collapsed" />
</Grid>
</Viewbox>
</Border>
</UserControl>
コントロールの MeasureOverride メソッドをオーバーライドし、そこから目的のサイズ (キャンバスのサイズ) を返す必要があります。次に、親コントロールは、その子に対応するためにサイズを変更します (可能な場合)。
UniFormGrid を使用してこれをアーカイブできます。列または行を1に設定して、垂直/水平に配置されたアイテムを取得できるようにします
<UniformGrid Columns="1">
<Button Content="Content 1"/>
<Button Content="Content 2"/>
<Button Content="Content 3"/>
</UniformGrid>