1

を含む 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が (左ではなく) 水平方向の中央に設定されている場合、動作はさらに奇妙になります! 右側に大きなマージンを作成する代わりに、マージンは実際には左右に均等に配分されます。UserControlWPF が使用可能なすべてのスペースを使い果たした後にのみ、私の動的なサイズ変更が行われるようにしたいと考えています。それは、どのプログラマーも期待することではないでしょうか?

(私の実際のプロジェクトには、実際にはそれぞれ 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 レイアウトのバグだと思う理由です。

4

1 に答える 1

2

列の幅を明示的に指定する必要があります。

たとえば、両方の列を常に同じサイズにする場合は、 を使用しますWidth="*"
両方の列を必要なだけ広くしたい場合は、 を使用しますWidth="Auto"。これにより、サイズの異なる列が作成されます。
1 つの列を必要なだけ広くし、もう 1 つの列で残りのスペースを使用する場合Width="Auto"は、最初の列とWidth="*"2 番目の列で を使用します。

于 2012-10-12T15:23:46.067 に答える