使用箭头键时Datagrid MouseOver和Selected States

时间:2011-09-27 17:39:38

标签: wpf datagrid mouseover visualstatemanager

我有一个wpf数据网格。我添加了样式以在行上显示鼠标悬停颜色。

我想要实现的是当鼠标悬停出现时,用户开始使用箭头键上下导航,鼠标悬停需要消失,只有用户使用箭头键才能到达的行是突出了一个。

问题是当用户使用箭头键导航时,鼠标光标已经留在网格上,光标下的行保持高亮显示以及使用箭头的行。

这是我的样本xmal:

<DataGrid AutoGenerateColumns="True" Height="277" HorizontalAlignment="Left" Margin="0,311,0,0" Name="dataGrid1" 
          VerticalAlignment="Top" 
          Width="478" ItemsSource="{Binding Path=Persons}" 
          RowHeight="20" 
          RowHeaderWidth="35" Grid.ColumnSpan="2" >
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Style.Triggers>
                <Trigger Property="IsMouseOver"
                   Value="True">
                    <Setter Property="Background"
                       Value="Green" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>
</DataGrid>

由于

2 个答案:

答案 0 :(得分:1)

当用户点击箭头键时,您需要设置某种标记,以便仅在IsMouseOverIsUsingArrowKeys为假时才会更改背景。您甚至可以使用鼠标可见性作为条件而不是使用标记

我不是肯定的确切语法,但它应该是这样的

<Style.Triggers>
    <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
            <!-- May need to reference RelativeSource here, not sure -->
            <Condition Property="IsMouseOver" Value="False" />
            <Condition Binding="{Binding IsUsingArrowKeys}" Value="False" />
        </MultiDataTrigger.Conditions>
        <Setter Property="Background" Value="Green" />
    </MultiDataTrigger>
</Style.Triggers>

答案 1 :(得分:0)

我建议根据焦点触发器突出显示该行。

这样的事情:

<EventTrigger RoutedEvent="GotFocus"> 
 <EventTrigger.Actions>
   <BeginStoryboard>
     <Storyboard>
       <DoubleAnimation Storyboard.TargetName="dataGrid1" Storyboard.TargetProperty="Background" Duration="0:0:0.1" To="Green"/>
     </Storyboard>
   </BeginStoryboard>
 </EventTrigger.Actions> 
</EventTrigger>
<EventTrigger RoutedEvent="LostFocus"> 
 <EventTrigger.Actions>
  <BeginStoryboard>
    <Storyboard>
      <DoubleAnimation Storyboard.TargetName="dataGrid1" Storyboard.TargetProperty="Background" Duration="0:0:0.1" To="White"/>
    </Storyboard>
  </BeginStoryboard>
 </EventTrigger.Actions>
</EventTrigger>

并手动关注他们,如下所示:

private void Btn_Click(object sender, RoutedEventArgs e)
        {
            dataGrid1.Focus();
        }

因此当另一行获得焦点时,当前行失去焦点&amp;自动回退到非突出显示的颜色背景。