C# WPF GridView将宽度调整为可用空间大小
我的WPF应用程序中有一个ListViewC# WPF GridView将宽度调整为可用空间大小,c#,wpf,gridview,C#,Wpf,Gridview,我的WPF应用程序中有一个ListView <ListView Name="generatorsList" ItemsSource="{Binding GeneratorsList}" SelectionMode="Single"> <ListView.View> <GridView> <GridViewColumn DisplayMemberBinding="{Binding Name}">
<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时,操作
列将始终出现。那样
然后,如果用户愿意,他可以手动调整任何列的大小(因此不设置实际的“maxwidth
”,只设置width
)。
我尝试使用
*
但GridView不知道它的子项,因此*
在这里不起作用,自动
不是一个好选项,因为我无法设置每列所需的最大宽度,也不需要恒定宽度值,因为它必须取决于可变的窗口大小(可用空间大小)。我假设我需要某种类型的代码隐藏事件,但我不知道应该如何以正确的方式处理它。尝试以下方法:
<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(在我看来,这种情况更好) 试试这样的方法:
<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(在我看来,这种情况更好) 你可以总是把动作放在最前面:这样,不管窗口或列宽如何,它们总是在同一个位置。这会起作用,但这是一个技巧。列表与前面的操作按钮不匹配。如果
Name
字段太长怎么办?您可以始终将操作放在前面:这样,无论窗口或列宽如何,它们始终位于同一位置。这将起作用,但这是一个技巧。列表与前面的操作按钮不匹配。如果Name
字段太长怎么办?它会按预期调整自身大小,但结果是这样的:DataGrid
似乎自己添加了所有源项属性,有什么想法吗?抱歉,忘了这一点DataGrid
根据ItemsSource
自动生成列。只要在您的数据网格上设置AutoGenerateColumns=“False”
,您就会没事了。(我还编辑了我的答案以包含此修复)现在它工作正常,谢谢!此外,出于我自己的需要,我已将这些属性添加到DataGridBackground=“Transparent”GridLinesVisibility=“None”CanUserResizeRows=“False”CanUserReorderColumns=“False”RowHeaderWidth=“0”IsReadOnly=“True”SelectionMode=“Single”
满足您需求的样式取决于您:)我建议您查看所有的功能,因为DataGrid
有很多功能,其中很多功能在您的案例中都无法很好地启用。它还支持滚动,因此如果需要,您可以在DataGrid
的ScrollViewer
属性下测试更改属性(如果我没记错,一旦内容垂直溢出控件,它将打开垂直滚动条
)。它按预期调整了自身大小,但它是这样做的:DataGrid
似乎自己添加了所有源项属性,有什么想法吗?抱歉,忘了这一点DataGrid
根据ItemsSource
自动生成列。只要在您的数据网格上设置AutoGenerateColumns=“False”
,您就会没事了。(我还编辑了我的答案以包含此修复)现在它工作正常,谢谢!此外,出于我自己的需要,我已将这些属性添加到DataGridBackground=“Transparent”GridLinesVisibility=“None”CanUserResizeRows=“False”CanUserReorderColumns=“False”RowHeaderWidth=“0”IsReadOnly=“True”SelectionMode=“Single”
满足您需求的样式取决于您:)我建议您查看所有的功能,因为DataGrid
有很多功能,其中很多功能在您的案例中都无法很好地启用。它还支持滚动,因此如果需要,可以在DataGrid
的ScrollViewer
属性下测试更改属性(如果我没记错,一旦内容垂直溢出控件,它将打开垂直滚动条
)。