#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. Основная проблема заключается в том, что для определения источника (текстового блока, границы и т.д.) Потребуется переключатель, и что это срабатывает при повторном нажатии на ячейку (хотя это может быть изменено с помощью свойств).