2012-11-01 7 views
5

Mam DataGrid skonfigurowane z zdarzenie PreviewMouseDown w kontroli użytkownika. Chodzi o to, że kiedy użytkownik przenosi mysz do komórki, ustawia akcję, która ma działać w oparciu o zawartość komórki, a akcja zostanie uruchomiona, gdy użytkownik kliknie, niezależnie od tego, który przycisk myszy.
Moja obsługi zdarzeń (C#):WPF DataGrid PreviewMouseDown nie obsługuje klikania prawym przyciskiem myszy zgodnie z oczekiwaniami

private void LadderMouseClick(object sender, System.Windows.Input.MouseButtonEventArgs e) { 
     if (m_ActiveAction != null) { 
      m_ActiveAction(); 
     } 
     e.Handled = true; 
    } 

Moje DataGrid (XAML):

<DataGrid AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding Source={StaticResource sourceCollection}}" Name="DataGrid" RowDetailsVisibilityMode="Collapsed" IsReadOnly="True" Height="600" MouseLeave="DataGrid_MouseLeave" MouseEnter="DataGrid_MouseEnter" PreviewMouseDown="LadderMouseClick" PreviewMouseDoubleClick="LadderMouseDoubleClick" VerticalScrollBarVisibility="Hidden" SelectionUnit="Cell" SelectionMode="Single"> 

To działa, i prowadzi działania poprawnie, gdy użytkownik w prawo lub w lewo kliknięć nad DataGrid. Problem polega jednak na tym, że gdy użytkownik kliknie prawym przyciskiem myszy, komórka, w której znajduje się mysz, zostaje wybrana (wokół komórki pojawia się czarna ramka); tak się nie dzieje, gdy kliknęli w lewo.

Dlaczego zachowują się inaczej? Czy nie powinny być traktowane w ten sam sposób? Czy jest coś bardzo prostego, czego mi brakuje?

Z góry dziękuję!

EDIT:
mam tak daleko próbował DataGrid.UnselectAll(), DataGrid.UnselectAllCells(), DataGrid.SelectedIndex = -1, a DataGrid.CurrentCell = default (DataGridCellInfo). Żaden z nich nie pracował dla mnie.

EDYCJA # 2:
Jeśli to pomaga, używam DataGridTemplateColumns z TextBlocks do wyświetlania moich danych. Czy to może powodować takie zachowanie?

ROZWIĄZANIE:
ten został rozwiązany przez Peter Hansen jest sugestii co było dodać zdarzenie PreviewMouseRightButtonDown do siatki danych, jak również zdarzenia PreviewMouseDown.

Odpowiedz

4

Myślę, że to, co widzisz, to granica komórki, która jest wyświetlana po ustawieniu ostrości.

Można usunąć go poprzez ustawienie jej grubość do 0 tak:

<DataGrid.CellStyle> 
    <Style TargetType="DataGridCell"> 
     <Setter Property="BorderThickness" Value="0" /> 
    </Style> 
</DataGrid.CellStyle> 

Aktualizacja:
Podobno po ustawieniu zdarzenia PreviewMouseDown być obsługiwane, DataGrid zatrzymuje się tylko pozycje komórek podczas użyj lewego przycisku myszy.

Musisz również obsłużyć PreviewMouseRightButtonUp, aby zatrzymać klikanie prawym przyciskiem myszy.

Myślę, że to rozwiąże twój problem?

+0

Dzięki za odpowiedź, niestety to chyba nie naprawiło. Być może zainteresuje cię to, mimo że mój DataGrid jest ustawiony na Single SelectionMode, wiele komórek można podświetlić, jeśli kliknę po dodaniu lub usunięciu elementu. Pozostałe wybrane komórki wydają się mieć niebieskie obramowanie zamiast czarnego. –

+0

Mam zaktualizowaną odpowiedź - mam nadzieję, że to pomoże ci teraz .. –

+0

Oh wow, to jest interesujące, dodając poprawkę PreviewMouseRightButtonUp. Mógłbym przysiąc, że próbowałem tego wcześniej, ale faktycznie wypróbowałem PreviewMouseRightButtonDown, przed którym nie działałem. Dzięki za pomoc! –

1

Powinieneś być w stanie wywołać metodę UnselectAllCells dołączoną do DataGrids. To po prostu wygląda tak:

dataGrid.UnselectAllCells(); 

nazywają to po wykonaniu swoje działanie kliknięcia i powinien usunąć zaznaczenie komórek.

EDYCJA: Myślę, że twoja dataGrid.UnselectAllCells() nie wywołuje, ponieważ nadal jesteś w zdarzeniu PreviewMouseDown. Spróbuj zrobić odpowiednie zdarzenie PreviewRightMouseButtonUp i odznacz wybrane komórki. Czas, w którym powinieneś skorzystać z tej metody, może mieć kluczowe znaczenie dla jej sukcesu.

+0

Zmieniłem moje pytanie, aby odpowiedzieć na to, ale to nie zadziałało. Komórka nadal ma tę granicę wokół siebie. –

+0

Zaktualizuję moją odpowiedź. –

Powiązane problemy