6

ユーザーコントロールのPreviewMouseDownイベントでDataGridを設定しています。ユーザーがマウスをセルに移動すると、セルの内容に基づいて実行するアクションが設定され、ユーザーがクリックすると、どのマウスボタンに関係なく、アクションが実行されるという考え方です。
私のイベントハンドラー(C#):

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

これは機能し、ユーザーがDataGridを右クリックまたは左クリックしたときにアクションを適切に実行します。ただし、問題は、ユーザーが右クリックすると、マウスが置かれているセルが選択されることです(セルの周囲に黒い境界線が表示されます)。彼らが左クリックしたとき、これは起こりません。

なぜ彼らは異なった振る舞いをしているのですか?それらは同じように扱われるべきではありませんか?私が見逃している本当に単純なものはありますか?

前もって感謝します!

編集:
これまで、DataGrid.UnselectAll()、DataGrid.UnselectAllCells()、DataGrid.SelectedIndex = -1、およびDataGrid.CurrentCell = default(DataGridCellInfo)を試しました。それらのどれも私のために働いていません。

編集#2:
それが役立つ場合は、DataGridTemplateColumnsとTextBlocksを使用してデータを表示しています。これがこの動作を引き起こしている可能性がありますか?

解決策:
これは、PreviewMouseRightButtonDownイベントとPreviewMouseDownイベントをDataGridに追加するというPeterHansenの提案によって解決されました。

4

2 に答える 2

5

あなたが見ているのは、フォーカスがあるときに表示されているセルの境界線だと思います。

次のように厚さを0に設定すると、削除できます。

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

更新:
明らかに、PreviewMouseDownイベントを処理するように設定すると、DataGridは、マウスの左ボタンを使用した場合にのみセルの選択を停止します。

PreviewMouseRightButtonUp右クリックでセルを選択できないようにするには、同様に処理する必要があります。

それであなたの問題は解決すると思いますか?

于 2012-11-01T17:23:05.600 に答える
1

DataGrids に付属の UnselectAllCells メソッドを呼び出せるはずです。単純に次のようになります。

dataGrid.UnselectAllCells();

クリック アクションを実行した後にこれを呼び出すと、セルの選択が削除されます。

編集:あなたはまだ PreviewMouseDown イベントにいるため、 dataGrid.UnselectAllCells() が呼び出されていないと思います。対応する PreviewRightMouseButtonUp イベントを作成し、そこでセルの選択を解除してみてください。このメソッドを呼び出すイベントの時間は、成功の鍵となる可能性があります。

于 2012-11-01T14:53:37.060 に答える