Datagrid MouseOver и Selected States при использовании клавиш со стрелками - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть таблица данных 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 ]

1 голос
/ 27 сентября 2011

Вам нужно будет установить какой-нибудь флаг, когда пользователь нажимает клавишу со стрелкой, чтобы фон изменялся только в том случае, если IsMouseOver и IsUsingArrowKeys - false.Возможно, вы даже сможете использовать видимость мыши в качестве условия вместо флага

Я не уверен, точный синтаксис, но это должно быть что-то вроде этого

<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>
0 голосов
/ 27 сентября 2011

Я бы предложил выделить строку на основе их триггеров фокусировки.

Примерно так:

<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();
        }

Поэтому, когда другая строка получает фокус, текущая строка теряет фокус и автоматически возвращается к невыделенному цветному фону.

...