none
在 WPF中DataGrid自定义单元格模板后,单击单元格空白处无法选中行 RRS feed

  • 问题

  •    在使用DataGrid的过程中,用到了自定义模板,改下了DataGridCell的模板,同时改写了选中时的颜色以及平时的背景色,但是在实际操作中出现了,我在选中单元格的时候,只能点击有字的位置才能选中单元格以及选中当前行,如果单击单元格的空白处,就不能实现选中当前单元格以及当前行。

       经过排查,明白了是没有对单元格设置背景色的问题,但是问题是单元格设置背景色之后不能实现鼠标滑过当前行时,当前行变色。。颜色就会被固定下来。那么我想问的是有没有更好的解决方案,或者把单元格的背景色设置为透明。

       万分感谢!!!!

    2015年11月17日 9:00

答案

  • 首先,感谢您的回答,接下来我说明一下我的问题

    我最开始的问题不是点不了后面的白色的列,是当一个列的宽度大于内容的宽度时,会空出一部分,即在图中红色标注的位置,如果想选定行,则必须要点击有字的位置,否则无法选中行。

    然后您给的答案我尝试了一下。。因为我在设置样式的时候,还改写了,DataGrid,DataGridRow的样式,因此好像没有起到作用。但是问题得到了解决,方案是将DataGirdCell的颜色设置为

    Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}}"。这样就会使单元格的颜色和DataGrid行的颜色一致。也就不会出现空白处不能点选的问题。

    再次感谢您的回答。

    • 已建议为答案 Lymim 2015年11月24日 8:26
    • 已标记为答案 小菜包砸 2015年11月27日 2:37
    2015年11月24日 6:32

全部回复

  • 您好,

    >>但是在实际操作中出现了,我在选中单元格的时候,只能点击有字的位置才能选中单元格以及选中当前行,如果单击单元格的空白处,就不能实现选中当前单元格以及当前行。

    根据您的描述, 我尝试做了一个demo, 我这边是可以选中单元格的空白处的, 如果你指的是单元格最后面的空白处,那是不可以的,这个是by design 的。

    下面是的我的测试Demo

    <Window x:Class="DataGridDemo.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">	
        <Grid>
        	<DataGrid Name="dgUsers" AutoGenerateColumns="False" >
        		<DataGrid.Resources>
        			<Style TargetType="DataGridCell">
        				<Setter Property="Background" Value="Transparent"/>
    			<Setter Property="BorderBrush" Value="Transparent"/>
    			<Setter Property="BorderThickness" Value="1"/>
    			<Setter Property="Template">
    				<Setter.Value>
    					<ControlTemplate TargetType="{x:Type DataGridCell}">
    						<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
    							<ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
    						</Border>
    					</ControlTemplate>
    				</Setter.Value>
    			</Setter>
    			<Style.Triggers>
    				<Trigger Property="IsSelected" Value="True">
    					<Setter Property="Background" Value="Red"/>
    					<Setter Property="Foreground" Value="Yellow"/>
    					<Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
    				</Trigger>
    				<Trigger Property="IsKeyboardFocusWithin" Value="True">
    					<Setter Property="BorderBrush" Value="{DynamicResource {x:Static DataGrid.FocusBorderBrushKey}}"/>
    				</Trigger>
    				<MultiTrigger>
    					<MultiTrigger.Conditions>
    						<Condition Property="IsSelected" Value="true"/>
    						<Condition Property="Selector.IsSelectionActive" Value="false"/>
    					</MultiTrigger.Conditions>
    					<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/>
    					<Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/>
    					<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}}"/>
    				</MultiTrigger>
    				<Trigger Property="IsEnabled" Value="false">
    					<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
    				</Trigger>
    			</Style.Triggers>
    				</Style>
    			</DataGrid.Resources>
    			<DataGrid.Columns>
                                    <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
                                    <DataGridTextColumn Header="Birthday" Binding="{Binding Birthday}" />
                            </DataGrid.Columns>						 
    		</DataGrid>        
        </Grid>
    </Window>
    

    我的屏幕截图

    2015年11月18日 8:06
  • 首先,感谢您的回答,接下来我说明一下我的问题

    我最开始的问题不是点不了后面的白色的列,是当一个列的宽度大于内容的宽度时,会空出一部分,即在图中红色标注的位置,如果想选定行,则必须要点击有字的位置,否则无法选中行。

    然后您给的答案我尝试了一下。。因为我在设置样式的时候,还改写了,DataGrid,DataGridRow的样式,因此好像没有起到作用。但是问题得到了解决,方案是将DataGirdCell的颜色设置为

    Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}}"。这样就会使单元格的颜色和DataGrid行的颜色一致。也就不会出现空白处不能点选的问题。

    再次感谢您的回答。

    • 已建议为答案 Lymim 2015年11月24日 8:26
    • 已标记为答案 小菜包砸 2015年11月27日 2:37
    2015年11月24日 6:32