を含む WPF ウィンドウを次に示しますUserControl
。これは、明確な幅のない 2 列UserControl
の単純なものです。Grid
最初の列では、TextBox
水平方向にストレッチするための単純なセットを追加しました。2 番目の列は空です。
UserControl
ウィンドウの幅を縮小すると、右側にまだ巨大な空白スペースがあるにもかかわらず、WPF によってトリミングされます。空であっても、2 番目の列を最初の列と同じサイズにしようとしているように見えますが、奇妙なことに、これは UserControl の外で発生します (そうでなければ、空白はピンクになります!)...
MainWindow.XAML :
<Window x:Class="WPF_Grid_Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPF_Grid_Test"
Title="MainWindow" Height="350" Width="525">
<local:TestUserControl HorizontalAlignment="Left"/>
</Window>
ユーザー コントロール.XAML :
<UserControl x:Class="WPF_Grid_Test.TestUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Pink" Height="100">
<Grid Margin="0" ShowGridLines="True">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBox Text="Why is WPF cropping me even though there's a huge blank space to eat into?" VerticalAlignment="Center" />
</Grid>
</UserControl>
すべてを0に設定してみMargins
ましPaddings
たが、変化はありません。
UserControl
が (左ではなく) 水平方向の中央に設定されている場合、動作はさらに奇妙になります! 右側に大きなマージンを作成する代わりに、マージンは実際には左右に均等に配分されます。UserControl
WPF が使用可能なすべてのスペースを使い果たした後にのみ、私の動的なサイズ変更が行われるようにしたいと考えています。それは、どのプログラマーも期待することではないでしょうか?
(私の実際のプロジェクトには、実際にはそれぞれ TextBlock、TextBox、および Button を含む 3 つの列がありますが、動作は同じです。WPF が独自の自動生成されたマージンを食べる前に、UIElements がトリミングされます)
列に明確な幅 (つまり、「自動」) を設定すると、WPF は UserControl をトリミングする前に空白を正しく削除します。ただし、これにより、ウィンドウがさらに薄くなるため、WPF が UserControl を縮小できなくなります。
私の最初の質問は、これは WPF のバグではありませんか?
私の 2 番目の質問は、WPF が UserControlを表示するスペースがなくなった場合にのみサイズ変更を開始するように列を設定する方法ですか?
これは .NET 4.0 です。同様の質問がここにありますが、解決策がよくわかりません。
更新:
の別のサンプル コードを次に示しUserControl
ます。提案されているように列の幅を「自動」に設定するUserControl
と、ウィンドウが縮小されるにつれて要素の縮小が停止し、スペースが実際に不足すると最終的に右端の要素がトリミングされます。
<UserControl x:Class="WPF_Grid_Test.TestUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Pink" Height="100">
<Grid Margin="0" ShowGridLines="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox Text="Resize us" VerticalAlignment="Center" Grid.Column="0" />
<TextBox Text="only when" VerticalAlignment="Center" Grid.Column="1" />
<TextBox Text="you're out of space!" VerticalAlignment="Center" Grid.Column="2" />
</Grid>
</UserControl>
私が達成しようとしている動作は、ウィンドウを縮小してもUserControl
保持されることです。DesiredSize
ただし、ウィンドウが空白領域外にある場合にのみUserControl
、「縮小」処理を行う必要があります。
ColumnDefinitions からを削除してみてください。コンテナにスペースがなくなる前にWidth=Auto
、右端の要素のサイズがどのように変更されるかを確認してください。これが、これが実際に WPF レイアウトのバグだと思う理由です。