6

この組み合わせでリストビューをビューの外に押し出すグリッドスプリッターに問題があります。再現する手順:

  • プログラムを起動し、ウィンドウ サイズを大きくドラッグします
  • 赤いスプリッターを左端までドラッグして、青い列を最小化します
  • ビューポートの外に出て水平スクロールが表示されるまで、両方の ListView 列を広げます
  • ウィンドウのサイズをもう一度小さくドラッグします

私にとって、これは ListView をウィンドウの外にゆっくりと押し出します。ScrollViewer は実際には Window のサイズに合わせて縮小されていますが、同じ速度ではなく、ゆっくりと見えなくなることに注意してください。スクロールビューアがビューから滑り落ち始めると、スプリッターは使用できなくなります。

奇妙なことに、最初に左側のパネルを最小化しないと、この動作が得られません!

これに対する修正は何ですか?

<Window x:Class="LayoutTest3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="600" Width="800" MinHeight="600" MinWidth="800" >
    <Window.Resources>
        <XmlDataProvider XPath="/Celebrities/Celebrity" x:Key="celebs">
            <x:XData>
                <Celebrities xmlns="">
                    <Celebrity Name="Jimmy">
                        <LastName>Page</LastName>
                    </Celebrity>
                    <Celebrity Name="Johnny">
                        <LastName>Depp</LastName>
                    </Celebrity>
                    <Celebrity Name="Britney">
                        <LastName>Spears</LastName>
                    </Celebrity>
                </Celebrities>
            </x:XData>
        </XmlDataProvider>

        <DataTemplate x:Key="NameTemplate">
            <TextBlock Text="{Binding XPath=@Name}" />
        </DataTemplate>
    </Window.Resources>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" MinWidth="100" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" MinWidth="400" />
        </Grid.ColumnDefinitions>
        <Border Grid.Column="0" Background="Blue" />
        <GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Center" ResizeBehavior="PreviousAndNext" VerticalAlignment="Stretch" Background="Red" />
        <Border Grid.Column="2" Background="Green">
            <ListView ItemsSource="{Binding Source={StaticResource celebs}}">
                <ListView.View>
                    <GridView>
                        <GridView.Columns>
                            <GridViewColumn Header="Name" CellTemplate="{StaticResource NameTemplate}" Width="150" />
                            <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding XPath=LastName}" />
                        </GridView.Columns>
                    </GridView>
                </ListView.View>
            </ListView>
        </Border>
    </Grid>
</Window>
4

3 に答える 3

7

GridSplitterとMinWidthのColumnには既知の問題がありますが、GridSplitterはColumnのMinWidthを無視してグリッドのサイズを変更したままです。その結果、成長する列の子は、実際に使用可能なサイズが大きくなります。ただし、グリッドはMinWidthを考慮して子をレイアウトするため、縮小列はMinWidthのままですが、Growing Columnの子は、GridSplitterが縮小列のMinWidthを超えたサイズのビューから外れます。

プロジェクトの1つでこれをどのように解決したかを調べ、コードを投稿します。その間、次のオプションを試すことができます。

  1. ColumnDefinitionからMinWidthを削除します
  2. 子にMinWidthを追加する

グリッドの最小サイズは500+スプリッターのサイズである必要があることを事前に知っているので、グリッド全体の最小幅を設定できます。

于 2011-06-22T06:56:13.550 に答える
2

これが私がそれをした方法です:

<Grid Name="container" SizeChanged="container_SizeChanged">
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition Name="rightPanel" Width="*" MinWidth="100"/>
    </Grid.ColumnDefinitions>
    <TextBlock Grid.Column="0" Background="Red" Foreground="White">Test</TextBlock>
    <GridSplitter Grid.Column="0" VerticalAlignment="Stretch" HorizontalAlignment="Right" Width="2" Height="Auto" ResizeDirection="Columns"/>
    <Border Grid.Column="1" Background="Green" Margin="0 0 0 0">
        <ListView ItemsSource="{Binding Source={StaticResource celebs}}">
            <ListView.View>
                <GridView>
                    <GridView.Columns>
                        <GridViewColumn Header="Name" CellTemplate="{StaticResource NameTemplate}" Width="150" />
                        <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding XPath=LastName}" />
                    </GridView.Columns>
                </GridView>
            </ListView.View>
        </ListView>
    </Border>
</Grid>

とコードビハインド(うん!):

private void container_SizeChanged(object sender, SizeChangedEventArgs e)
{
    rightPanel.MaxWidth = container.ActualWidth - 150;
}

基本的に、最小幅を取り出し、同様の計算を実行して、他のパネルでMaxWidthを設定します。

于 2011-06-22T09:03:33.427 に答える
1

多分これが役立つかもしれません.幅/高さに常に同じタイプの単位を使用する必要があります.そうしないとスプリッターが正しく機能しません.

 <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*" MinWidth="150"/>
        <ColumnDefinition Width="4*" MinWidth="150"/>
    </Grid.ColumnDefinitions>

    <ListView Grid.Column="0" BorderBrush="#FF005BFF" Margin="0,0,5,0">
        <ListView.View>
            <GridView>
                <GridViewColumn />
            </GridView>
        </ListView.View>
    </ListView>

    <GridSplitter Grid.Column="1" 
                  HorizontalAlignment="Left" VerticalAlignment="Stretch" 
                  Background="Black" 
                  ShowsPreview="true"
                  Width="2" />

    <ListView Grid.Column="1" BorderBrush="#FFFF5100" Margin="5,0,0,0">
        <ListView.View>
            <GridView>
                <GridViewColumn />
            </GridView>
        </ListView.View>
    </ListView>
</Grid>
于 2014-09-17T21:40:21.697 に答える