2012-11-01 30 views
5

Tôi có một DataGrid được thiết lập với sự kiện PreviewMouseDown trong Điều khiển người dùng. Ý tưởng là khi người dùng di chuyển chuột của họ vào một ô, nó sẽ đặt Hành động để chạy dựa trên nội dung của ô và Hành động sẽ chạy khi người dùng nhấp, bất kể nút chuột nào.
xử lý sự kiện của tôi (C#):WPF DataGrid PreviewMouseDown không xử lý nhấp chuột phải như mong đợi

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

My 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"> 

này hoạt động, và chạy các hành động đúng cách nhấp chuột khi người dùng hoặc phải hoặc trái trên DataGrid. Tuy nhiên, vấn đề là khi người dùng nhấp chuột phải, ô của họ sẽ được chọn (một đường viền màu đen xuất hiện xung quanh ô); điều này không xảy ra khi họ nhấp chuột trái.

Tại sao chúng hoạt động khác nhau? Không nên chúng được xử lý theo cùng một cách? Có cái gì đó thực sự đơn giản tôi đang mất tích?

Cảm ơn trước!

EDIT:
Tôi đã cố gắng cho đến nay DataGrid.UnselectAll(), DataGrid.UnselectAllCells(), DataGrid.SelectedIndex = -1, và DataGrid.CurrentCell = mặc định (DataGridCellInfo). Không ai trong số họ đã làm việc cho tôi.

EDIT # 2:
Nếu được, tôi đang sử dụng DataGridTemplateColumns với TextBlocks để hiển thị dữ liệu của tôi. Điều này có thể gây ra hành vi này không?

SOLUTION:
này được giải quyết bằng cách Peter Hansen 's đề nghị đó là thêm một sự kiện PreviewMouseRightButtonDown để DataGrid cũng như các sự kiện PreviewMouseDown.

Trả lời

4

Tôi nghĩ những gì bạn đang thấy là đường viền của ô, được hiển thị khi nó có tiêu điểm.

Bạn có thể loại bỏ nó bằng cách thiết lập độ dày của nó đến 0 như thế này:

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

Cập nhật:
Rõ ràng khi bạn thiết lập các sự kiện PreviewMouseDown để được xử lý, DataGrid chỉ dừng lại lựa chọn của các tế bào khi bạn sử dụng nút chuột trái.

Bạn cũng phải xử lý PreviewMouseRightButtonUp để dừng các nhấp chuột phải chọn ô.

Tôi nghĩ điều đó sẽ giải quyết được vấn đề của bạn?

+0

Cảm ơn bạn đã trả lời, rất tiếc điều này dường như không khắc phục được. Bạn có thể muốn biết rằng, mặc dù DataGrid của tôi được đặt thành Single SelectionMode, nhiều ô có thể được đánh dấu nếu tôi nhấp vào sau khi một mục được thêm hoặc xóa. Các ô được chọn khác dường như có đường viền màu xanh thay vì một đường viền màu đen. –

+0

Tôi đã cập nhật câu trả lời của mình - hy vọng nó sẽ giúp bạn ngay bây giờ .. –

+0

Oh wow thú vị, thêm PreviewMouseRightButtonUp đã sửa nó. Tôi có thể thề rằng tôi đã thử điều này trước đây, nhưng tôi thực sự đã thử PreviewMouseRightButtonDown trước khi không hoạt động. Cảm ơn bạn đã giúp đỡ! –

1

Bạn có thể gọi phương thức UnselectAllCells đi kèm với DataGrids. Nó đơn giản trông giống như sau:

dataGrid.UnselectAllCells(); 

Gọi sau khi thực hiện hành động nhấp chuột và bạn nên xóa lựa chọn ô.

EDIT: Tôi nghĩ dataGrid của bạn.UnselectAllCells() không gọi vì bạn vẫn đang ở trong sự kiện PreviewMouseDown. Hãy thử tạo sự kiện PreviewRightMouseButtonUp tương ứng và bỏ chọn các ô của bạn ở đó. Thời gian trong trường hợp bạn gọi phương thức này có thể rất quan trọng để thành công.

+0

Tôi đã chỉnh sửa câu hỏi của mình để trả lời câu hỏi này, nhưng điều này không hiệu quả. Các tế bào vẫn có biên giới xung quanh nó. –

+0

Tôi sẽ cập nhật câu trả lời của mình. –

Các vấn đề liên quan