wpf 关于datagrid的行选模式

open382000 2013-12-29 02:50:03
现在我引用了一个资源 是这样的




<Style TargetType="DataGrid">
<!--网格线颜色-->
<Setter Property="CanUserResizeColumns" Value="True"/>
<Setter Property="Background" Value="White" />
<Setter Property="BorderBrush" Value="#d6c79b" />
<Setter Property="HorizontalGridLinesBrush">
<Setter.Value>
<SolidColorBrush Color="#d6c79b"/>
</Setter.Value>
</Setter>
<Setter Property="VerticalGridLinesBrush">
<Setter.Value>
<SolidColorBrush Color="#d6c79b"/>
</Setter.Value>
</Setter>
</Style>

<!--<Style TargetType="DataGridColumnHeader">
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="MinWidth" Value="0" />
<Setter Property="MinHeight" Value="28" />
<Setter Property="Foreground" Value="Black" />
<Setter Property="FontSize" Value="14" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="DataGridColumnHeader">

<Border x:Name="BackgroundBorder" BorderThickness="0,1,0,1"
BorderBrush="#e6dbba"
Width="Auto">
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ContentPresenter Margin="0,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<Rectangle Width="1" Fill="#d6c79b" HorizontalAlignment="Right" Grid.ColumnSpan="1" />
</Grid>
</Border>

</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Height" Value="25"/>
</Style>-->


<Style TargetType="DataGridColumnHeader">
<Setter Property="MinWidth" Value="0" />
<Setter Property="MinHeight" Value="28" />
<Setter Property="Foreground" Value="Black" />

<Setter Property="FontSize" Value="14" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Height" Value="25"/>
</Style>
<!--行样式触发-->
<!--背景色改变必须先设置cellStyle 因为cellStyle会覆盖rowStyle样式-->
<Style TargetType="DataGridRow">
<Setter Property="Background" Value="White" />
<Setter Property="Height" Value="25"/>
<Setter Property="Foreground" Value="Black" />
<Style.Triggers>
<!--隔行换色-->
<Trigger Property="AlternationIndex" Value="0" >
<Setter Property="Background" Value="#ecf6fc" />
</Trigger>
<!--<Trigger Property="AlternationIndex" Value="1" >
<Setter Property="Background" Value="#ecf6fc" />
</Trigger>-->

<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="LightGray"/>
<Setter Property="Foreground" Value="White"/>
</Trigger>

<Trigger Property="IsSelected" Value="True">
<Setter Property="Foreground" Value="Black"/>
<Setter Property="Background" Value="DodgerBlue"/>
</Trigger>
</Style.Triggers>
</Style>

<!--单元格样式触发-->
<Style TargetType="DataGridCell">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="DataGridCell">
<TextBlock TextAlignment="Center" VerticalAlignment="Center" >
<ContentPresenter />
</TextBlock>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="DodgerBlue"/>
<!--<Setter Property="BorderBrush" Value="Red"/>-->
<Setter Property="Foreground" Value="Black"/>
</Trigger>
<!--<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="DodgerBlue"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Foreground" Value="Black"/>
</Trigger>-->
</Style.Triggers>
</Style>
<Style TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="Visibility" Value="Hidden"/>
<Setter Property="Height" Value="0"/>
</Style>



可是我发现一个问题 就是
我鼠标单击单元格的时候它是选一行的编辑模式,我如果改成只选单元格的模式呢 而又不会和其他样式冲突呢?

还有个问题就是

我在编辑这个单元格之后 我想按回车就跳到下行 同列的单元格 或者按tab跳到下行同列的单元格进行编辑,该怎么办呢?

求老师们指点
...全文
545 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
小猪八Q 2014-01-15
  • 打赏
  • 举报
回复
引用 6 楼 open382000 的回复:
[quote=引用 5 楼 wpfLove 的回复:] [quote=引用 4 楼 open382000 的回复:] 这里我需要实现的是 鼠标移动也要改变颜色 怎么办呢。
没办法吧,无论鼠标移动,还是你要求的键盘操作,都是会选中行了,控件本身并没有这样的区分,如果一定要区分的话,你试试写个新的控件,继承子DataGrid,定义一个EventSource的依赖属性,然后设计样式: <Trigger Property="EventSource" Value="Mouse"> <Setter Property="Foreground" Value="Black"/> <Setter Property="Background" Value="DodgerBlue"/> </Trigger> 修改成这样的 同时为你的控件注册Key和Mouse的事件,动态调整EventSource为Mouse或者Key 这个思路就是这样,你可以试试。 最复杂的情况就是你完全自写一个新的类似DataGrid的控件(这个是最笨最不理想的方法了)[/quote] 那问下这位老师,,我看了那个access里面的那些表。。也是这样行选变色,但是点单元格的时候 就显示单元格的边框变色。。这样是如何做到的呀[/quote] 使用DataGrid的SelectionUnit设置下: grid.SelectionUnit = DataGridSelectionUnit.CellOrRowHeader;
open382000 2014-01-15
  • 打赏
  • 举报
回复
引用 5 楼 wpfLove 的回复:
[quote=引用 4 楼 open382000 的回复:] 这里我需要实现的是 鼠标移动也要改变颜色 怎么办呢。
没办法吧,无论鼠标移动,还是你要求的键盘操作,都是会选中行了,控件本身并没有这样的区分,如果一定要区分的话,你试试写个新的控件,继承子DataGrid,定义一个EventSource的依赖属性,然后设计样式: <Trigger Property="EventSource" Value="Mouse"> <Setter Property="Foreground" Value="Black"/> <Setter Property="Background" Value="DodgerBlue"/> </Trigger> 修改成这样的 同时为你的控件注册Key和Mouse的事件,动态调整EventSource为Mouse或者Key 这个思路就是这样,你可以试试。 最复杂的情况就是你完全自写一个新的类似DataGrid的控件(这个是最笨最不理想的方法了)[/quote] 那问下这位老师,,我看了那个access里面的那些表。。也是这样行选变色,但是点单元格的时候 就显示单元格的边框变色。。这样是如何做到的呀
小猪八Q 2014-01-14
  • 打赏
  • 举报
回复
引用 4 楼 open382000 的回复:
这里我需要实现的是 鼠标移动也要改变颜色 怎么办呢。
没办法吧,无论鼠标移动,还是你要求的键盘操作,都是会选中行了,控件本身并没有这样的区分,如果一定要区分的话,你试试写个新的控件,继承子DataGrid,定义一个EventSource的依赖属性,然后设计样式: <Trigger Property="EventSource" Value="Mouse"> <Setter Property="Foreground" Value="Black"/> <Setter Property="Background" Value="DodgerBlue"/> </Trigger> 修改成这样的 同时为你的控件注册Key和Mouse的事件,动态调整EventSource为Mouse或者Key 这个思路就是这样,你可以试试。 最复杂的情况就是你完全自写一个新的类似DataGrid的控件(这个是最笨最不理想的方法了)
open382000 2014-01-14
  • 打赏
  • 举报
回复
引用 3 楼 wpfLove 的回复:

<!--行样式触发-->
    <!--背景色改变必须先设置cellStyle 因为cellStyle会覆盖rowStyle样式-->
    <Style  TargetType="DataGridRow">
        <Setter Property="Background" Value="White" />
        <Setter Property="Height" Value="25"/>
        <Setter Property="Foreground" Value="Black" />
        <Style.Triggers>
            <!--隔行换色-->
            <Trigger Property="AlternationIndex" Value="0" >
                <Setter Property="Background" Value="#ecf6fc" />
            </Trigger>
            <!--<Trigger Property="AlternationIndex" Value="1" >
                <Setter Property="Background" Value="#ecf6fc" />
            </Trigger>-->
 
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="LightGray"/>
                <Setter Property="Foreground" Value="White"/>
            </Trigger>
 
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Foreground" Value="Black"/>
                <Setter Property="Background" Value="DodgerBlue"/>
            </Trigger>
        </Style.Triggers>
    </Style>
你的选中背景来自这里的IsSelected中的DogerBule,如果你都去掉了,它难道还会有这么个颜色?
这里我需要实现的是 鼠标移动也要改变颜色 怎么办呢。
小猪八Q 2014-01-14
  • 打赏
  • 举报
回复

<!--行样式触发-->
    <!--背景色改变必须先设置cellStyle 因为cellStyle会覆盖rowStyle样式-->
    <Style  TargetType="DataGridRow">
        <Setter Property="Background" Value="White" />
        <Setter Property="Height" Value="25"/>
        <Setter Property="Foreground" Value="Black" />
        <Style.Triggers>
            <!--隔行换色-->
            <Trigger Property="AlternationIndex" Value="0" >
                <Setter Property="Background" Value="#ecf6fc" />
            </Trigger>
            <!--<Trigger Property="AlternationIndex" Value="1" >
                <Setter Property="Background" Value="#ecf6fc" />
            </Trigger>-->
 
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="LightGray"/>
                <Setter Property="Foreground" Value="White"/>
            </Trigger>
 
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Foreground" Value="Black"/>
                <Setter Property="Background" Value="DodgerBlue"/>
            </Trigger>
        </Style.Triggers>
    </Style>
你的选中背景来自这里的IsSelected中的DogerBule,如果你都去掉了,它难道还会有这么个颜色?
open382000 2014-01-13
  • 打赏
  • 举报
回复
引用 1 楼 wpfLove 的回复:
(1)你可以取消行选中的样式,删除下面这段样式即可

<Trigger Property="IsSelected" Value="True">
                <Setter Property="Foreground" Value="Black"/>
                <Setter Property="Background" Value="DodgerBlue"/>
            </Trigger>
同时添加一个EditingElementStyle设置处于编辑状态的样式 (2) 这个你可以通过DataGrid的CurrentCell可以获取到当前的单元格以及所在的列,再通过SelectedIndex等获取到当前的行,或者通过CurrentCellChanged事件,都可以获取到相关信息,然后设置你的下一个位置为CurrentCell,调用BeginEdit即可(还有CancelEdit和CommitEdit分别是取消和提交)
我去掉了 还是行选。。。无解啊。。
小猪八Q 2013-12-29
  • 打赏
  • 举报
回复
(1)你可以取消行选中的样式,删除下面这段样式即可

<Trigger Property="IsSelected" Value="True">
                <Setter Property="Foreground" Value="Black"/>
                <Setter Property="Background" Value="DodgerBlue"/>
            </Trigger>
同时添加一个EditingElementStyle设置处于编辑状态的样式 (2) 这个你可以通过DataGrid的CurrentCell可以获取到当前的单元格以及所在的列,再通过SelectedIndex等获取到当前的行,或者通过CurrentCellChanged事件,都可以获取到相关信息,然后设置你的下一个位置为CurrentCell,调用BeginEdit即可(还有CancelEdit和CommitEdit分别是取消和提交)
在Windows系统中,notepad.exe(记事本)是一个“经典的”、“简洁的”文本编辑器。这个软件,没有华丽的外观,也没有繁杂的功能,仅仅是一个文本编辑小软件。虽然经过Windows系统数十年的变换,但它却保持着永恒姿态,数十年来几乎不曾改变过。曾经,VS中的经典DEMO中,就有它的身影,一个新建的项目,就藏有一个新建的“记事本”。然而,在WPF的项目中,“记事本”却消失的无影无踪,也许是很容易实现,也许是为了革新,而不愿再传承“经典”。确实,使用WPF技术再次让“记事本”复活,确实也是一件非常容易的事情。但是,如果,使用WPF技术,再搭配当下非常流行的MVVM模式呢?复活“记事本”的难度却陡然上升至很多WPF程序员为之默默叹气。而,MVVM模式是掌握WPF的最顶级技术,MVVM模式拥有的无尽的优势,让WPF相对于过往的编程模式来说,是一种革命性的创新,从而也成为大中型WPF项目中必须的模式。但,学习难度。。。。。。在这个《WPF记事本开发详解》的课程中,赵老师带领你在WPF中,从零开始一步步构建MVVM模式,直到让你亲自以WPF+MVVM的方式,让这个经典的“记事本”软件从你的手中“复活”。在课程中,赵老师会详细讲解WPF和MVVM中的各种技巧,让你从此爱上WPF+MVVM编程。

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧