wpf如何让datagrid每一行重叠显示,一行叠在另外一行上面
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wpf如何让datagrid每一行重叠显示,一行叠在另外一行上面相关的知识,希望对你有一定的参考价值。
取巧的方法就是使用分页控件,然后设置每页只显示1条数据,这样就能满足你的需要了。但是在WPF貌似没有PagedCollectionView,所以你可以动态的去改变datagrid的绑定值,也就是每次只给它一条数据。
再或者你可以设置一下datagrid的高度,让它只能显示一行的数据,然后隐藏滚动条,最后通过设置纵向滚动条的偏移量来实现切换到第几行数据。
当然你也可以去重写或自定义一个ItemsPresenter控件......... 参考技术A 什么叫做一行叠在另外一行上面?有没有图可以说明下?追问
就是行不是上一行下一行的方式,而是一行覆盖另外一行,也就是说行不是上下排列,而是纵向(往里)排列的
追答天。。。那你不是只能看到最外面的那一行数据。。。
追问恩,我是要做一个车辆调度,一条直线,上面显示车辆在动(从左到右),我又不想动态生成控件的方法,想用datagrid绑定,大哥,你有好方法么
当 SelectionMode 设置为 Cell 时,如何突出显示 WPF DataGrid 中的一行
【中文标题】当 SelectionMode 设置为 Cell 时,如何突出显示 WPF DataGrid 中的一行【英文标题】:How do I highlight a row in the WPF DataGrid when SelectionMode is set to Cell 【发布时间】:2015-08-28 14:58:47 【问题描述】:我有一个 DataGrid 绑定到 WPF 应用程序中的 DataTable。 DataGrid 的 SelectionUnit 必须设置为 Cell,但我还想为整行添加一个微妙的突出显示,以便在宽 DataGrids 上,当用户滚动所选单元格时,他们可以仍然看到突出显示的行。
这有点问题,因为 DataGridRow 的 IsSelected 属性永远不会设置为 true,因为没有选择 Row,而是选择了 Cell。
我不介意它是粘性 RowSelector 中的一个小箭头,还是应用于整个 Row 的突出显示。只需要某种方式突出显示选择了哪一行。
【问题讨论】:
Might be related 感谢@MikeEason - 解决方案是更改 SelectionUnit,但我需要保留单个单元格选择。 【参考方案1】:我在这里玩了一点,没什么特别的,但它是一个工作版本:
<Style TargetType="DataGridCell">
<EventSetter Event="Selected" Handler="EventSetter_OnHandlerSelected"/>
<EventSetter Event="LostFocus" Handler="EventSetter_OnHandlerLostFocus"/>
</Style>
这是代码隐藏:
private void EventSetter_OnHandlerSelected(object sender, RoutedEventArgs e)
DataGridRow dgr = FindParent<DataGridRow>(sender as DataGridCell);
dgr.Background = new SolidColorBrush(Colors.Red);
private void EventSetter_OnHandlerLostFocus(object sender, RoutedEventArgs e)
DataGridRow dgr = FindParent<DataGridRow>(sender as DataGridCell);
dgr.Background = new SolidColorBrush(Colors.White);
这是获取父级的辅助方法:
public static T FindParent<T>(DependencyObject child) where T : DependencyObject
//get parent item
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
//we've reached the end of the tree
if (parentObject == null) return null;
//check if the parent matches the type we're looking for
T parent = parentObject as T;
if (parent != null)
return parent;
else
return FindParent<T>(parentObject);
这不是 MVVM,但考虑到我们只是在使用 View 元素 .. 我认为这一次不是必须的。 所以基本上,在第一次选择时,您为该行着色,在失去焦点时转回白色前一个并更改新选择的颜色。
【讨论】:
【参考方案2】:这很有效,并且与 MVVM 一样。为了更好的可读性,我使用了ExpressionConverter,这是一种让 XAML 更具可读性但更容易出错的惊人方式。我还对其进行了一些更改以支持多重绑定,但这是题外话,您可以从代码中获得基本思想:从行和网格的 CurrentCell 属性中获取数据上下文,并比较它们是否相同。
<DataGrid.Resources>
<Style TargetType="x:Type DataGridRow">
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="amazing:ExpressionConverter 'x[0] == x[1]'">
<Binding RelativeSource="RelativeSource Self" Path="DataContext"></Binding>
<Binding ElementName="Grid" Path="CurrentCell" Converter="amazing:ExpressionConverter 'x.Item'"></Binding>
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Background" Value="Red"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
【讨论】:
【参考方案3】:我在 MSDN 上找到了一个很好的解决方案。链接到我对类似问题的回答:
Highlight row when SelectionUnit is set to Cell
【讨论】:
以上是关于wpf如何让datagrid每一行重叠显示,一行叠在另外一行上面的主要内容,如果未能解决你的问题,请参考以下文章
wpf datagrid 默认选择为最新的一行,不知道为啥设置不了
C# WPF datagrid checkboxcolumn 使用问题
c# wpf datagrid 模板列修改某个单元格,更新所选行另一个单元格的值,如何做到呢?