Baburc Ответов: 1

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


Хай

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

Пожалуйста, скажите мне, как это сделать

Спасибо.

в XAML

Popup Margin= "0,0,0,0" Name= "Popup1" PlacementTarget= "{Binding ElementName=DgvMain} "HorizontalAlignment= "Left" VerticalAlignment= " Top "Width= "250" Height=" 165 " >

Всплывающий

Что я уже пробовал:

публичный статический класс DataGridExtensions
{
public static DataGridCell GetCurrentDataGridCell(this DataGrid dataGrid)
{
DataGridCellInfo cellInfo = dataGrid. CurrentCell;
if (cellInfo.IsValid = = false)
{
возвращать null;
}
var cellContent = cellInfo.Колонка.GetCellContent(cellInfo. Item);
if (cellContent = = null)
{
возвращать null;
}
верните cellContent.Родитель как DataGridCell;
}
}


частная DgvMain_BeginningEdit недействительным(объект отправителя, DataGridBeginningEditEventArgs е)
{
Ячейка DataGridCell = DgvMain.GetCurrentDataGridCell();
var Position = ячейка.PointToScreen (новая точка(0, 0));
// MessageBox.Показать ("X=" + Позиция.Х. Метод ToString() + ", Г=" + Позиция.Г.Метод ToString(), "Положение");

Popup1.PlacementRectangle = новый прямоугольник(поз.Х - DgvMain.Маржа.Слева-110, Позиция.Г - DgvMain.Маржа.Топ-115, 0, 0);
Popup1.Isopen значение = ИСТИНА;
}

1 Ответов

Рейтинг:
8

Baburc

Я получил его myseslf

     private double GetColumnXPosition(DataGridColumn column, DataGrid grid)
{
     double result = 0.0;

    if (grid == null)
        return result;

    for (int i = 0; i < grid.Columns.Count; i++)
    {
        DataGridColumn dgc = grid.Columns[i];
        if (dgc.Equals(column))
            break;

        result += dgc.ActualWidth;
    }
    return result;
}
private DataGrid GetRowsDataGrid(DataGridRow row)
{
    DependencyObject result = VisualTreeHelper.GetParent(row);
    while (result != null && !(result is DataGrid))
    {
        result = VisualTreeHelper.GetParent(result);
    }
    return result as DataGrid;
}

private void DgvMain_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
    Point newPosition = new Point();

    double rowX=0;
    DataGrid dg = GetRowsDataGrid(e.Row); //get the Row's corresponding DataGrid with the help of the VisualTreeHelper. You cant use the Column here, because it won't get added to the visual tree.
    if (dg != null)
    {
        rowX = GetColumnXPosition(e.Column, dg); //get the x position. Here you can't use .TranslatePoint because - again - it doesn't belong to the visual tree, so you have to sum up all columns width' to the column where the changes are made.
        newPosition = e.Row.TranslatePoint(new Point( DgvMain.RowHeaderWidth, e.Row.ActualHeight), this); //translate this point to a point on your main window.
    }

    if (newPosition != new Point())
    {

              Popup1.PlacementRectangle = new Rect(rowX + DgvMain.RowHeaderActualWidth, newPosition.Y - DgvMain.Margin.Top, 0, 0);

    }

    Popup1.IsOpen = true;

}


private void DgvMain_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    Popup1.IsOpen = false;
}