Как найти пиксельные координаты выбранной ячейки в WPF gridview

#wpf #datagrid #location #cell #dimensions

#wpf #datagrid #Расположение #ячейка #размеры

Вопрос:

Я несколько дней пытался ответить на этот вопрос. Я нашел фрагменты кода, которые подходят близко, но не дали мне того, что мне нужно.

Мне нужно иметь возможность идентифицировать координаты x и y конкретной ячейки в WPF datagrid. ячейка будет выбранной ячейкой. Мне также нужно иметь возможность определять точный размер этой ячейки.

это делается для того, чтобы я мог наложить элемент управления редактора на эту ячейку, когда пользователь редактирует ее, чтобы я мог принимать вводимые пользователем данные.

причина, по которой это должно быть сделано таким образом, заключается в том, что мне нужны разные редакторы по строкам. в datagrid есть несколько столбцов. в частности, в одном столбце пользователю предлагается указать значение. в зависимости от содержимого другого столбца тип ввода, который пользователь должен предоставить в столбце значений, изменяется. для ввода текста или чисел требуется текстовое поле. некоторые строки являются логическими, и пользователю необходимо выбрать из флажка. некоторые строки имеют предопределенные значения, и пользователю требуется поле со списком. также есть строки пути к файлу, и я хочу, чтобы автоматически открывалось диалоговое окно открытия файла и в ячейку помещалось выбранное имя файла. итак, я не могу просто использовать встроенные редакторы в datagrid, потому что это позволяет мне указывать формат по столбцу, но не также по строке. конечно, я не знаю содержимое строк заранее, поэтому это нужно сделать во время выполнения.

Я смог перемещать элементы управления редактора и делать их видимыми и невидимыми. Мне удалось получить координату X левой части выбранной ячейки. Я также смог найти ширину выбранной ячейки.

координату Y ячейки и высоту ячейки я пробовал несколькими различными способами, но ни один из них не сработал.

У меня уже есть логический поток, описывающий, как это сделать. Я выполнил пробный запуск в приложении window forms. 100 строк кода и около 30 минут, и это работало отлично. Я пытался выяснить, как сделать то же самое в WPF в течение нескольких дней. будем признательны за любую помощь.

Ответ №1:

Вот не очень элегантное решение:

 private void grid_MouseDown(object sender, MouseButtonEventArgs e)
    {
        Point point;
        Point point2;

        TextBlock tb = (TextBlock)e.OriginalSource;
        DataGridCell dgc = (DataGridCell)tb.Parent;
        point = e.GetPosition(dgc);
        point2 = e.GetPosition(this);
        double cell_width = dgc.ActualWidth;
        double absolute_x = point2.X - point.X;
    }
  

Там только X, но то же самое для Y. Основная проблема заключается в том, что для определения источника (текстового блока, границы и т.д.) Потребуется переключатель, и что это срабатывает при повторном нажатии на ячейку (хотя это может быть изменено с помощью свойств).