【问题标题】:WPF GridView adjust width to available space sizeWPF GridView 将宽度调整为可用空间大小
【发布时间】:2017-09-13 07:36:49
【问题描述】:

我的 WPF 应用程序中有一个 ListView

<ListView Name="generatorsList" ItemsSource="{Binding GeneratorsList}" SelectionMode="Single">
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding Name}">
                <GridViewColumn.Header>
                    <GridViewColumnHeader Tag="Name">Name</GridViewColumnHeader>
                </GridViewColumn.Header>
            </GridViewColumn>
            <GridViewColumn Header="Type" DisplayMemberBinding="{Binding Type}" />
            <GridViewColumn Header="Description" DisplayMemberBinding="{Binding Description}" />
            <GridViewColumn Header="Actions" Width="60">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        //buttons
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

看起来像这样

情况是,当窗口小于列表本身时(例如,如果描述很长,如所示示例),滚动条形成,GridView 保持不变,因此操作按钮在屏幕上不可见(用户必须拖动滚动条)。

我想在初始化时根据当前窗口宽度设置最大列宽,以便在向用户显示 ListView 时始终出现Actions 列。像那样

然后,如果用户愿意,他可以手动调整任何列的大小(因此没有设置实际的“maxwidth”,只设置了width)。 我尝试使用*,但 GridView 不知道它的孩子,所以* 在这里不起作用,auto 不是一个好选择,因为我无法设置每列所需的最大宽度,也是恒定宽度值是不需要的,因为它必须取决于可变的窗口大小(可用空间大小)。我假设我需要在代码中包含某种事件,但我不知道应该如何以正确的方式处理它。

【问题讨论】:

  • 您可以始终将动作放在前面:这样,无论窗口或列宽如何,它们始终位于同一位置。
  • 它会起作用,但这是一个技巧。列表在前面的操作按钮看起来不太好。如果Name 字段太长怎么办?

标签: c# wpf gridview


【解决方案1】:

试试这样的:

<DataGrid Name="generatorsList" 
          ItemsSource="{Binding GeneratorsList}"
          AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" 
                            Binding="{Binding Name}"
                            Width="*"/>

        <DataGridTextColumn Header="Type" 
                            Binding="{Binding Type}"/>

        <DataGridTextColumn Header="Description" 
                            Binding="{Binding Description}"
                            Width="2*"/>

        <DataGridTemplateColumn Header="Actions"
                                Width="auto"
                                MinWidth="60">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <!--buttons-->
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

我已将您的 ListView 更改为 DataGrid(在我看来更适合这种情况)。

【讨论】:

  • 它按预期调整自己的大小,但它是这样的:imgur.com/a/G9SWa 似乎DataGrid 本身添加了所有源项目属性,有什么想法吗?
  • 抱歉,忘记了。 DataGrid 自动根据ItemsSource 生成列。只需在您的DataGrid 上设置AutoGenerateColumns="False" 就可以了。 (我还编辑了我的答案以包含此修复)
  • 现在一切正常,谢谢!同样出于我自己的需要,我已将这些属性添加到 DataGrid Background="Transparent" GridLinesVisibility="None" CanUserResizeRows="False" CanUserReorderColumns="False" RowHeaderWidth="0" IsReadOnly="True" SelectionMode="Single"
  • 满足您需求的样式由您决定在你的情况下打开。它还支持滚动,所以如果你需要它,你可以在DataGridScrollViewer 属性下测试更改属性(如果我没记错的话,一旦你的内容垂直溢出你的控件,它就会变成垂直ScrollBar)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多