Наше требование — нарисовать пустую сетку (таблицу со строками и столбцами) поверх таблиц, присутствующих на изображении, и для одного изображения может быть несколько сеток. . Все сетки должны быть настраиваемыми, и мы можем добавить разделитель строк и разделитель столбцов по щелчку кнопки мыши в сетке. Определения сеток, миниатюр и строк-столбцов создаются на основе кода.
Проблема:
Если создается определение столбца или строки, положение миниатюр сетки изменяется, и это перемещается в первый столбец первой строки вместо того, чтобы оставаться статическим во внешней сетке. Изменяется положение верхнего, левого, правого и нижнего большого пальца. Не могли бы вы помочь нам в этом вопросе?
XAML:
Код: Выделить всё
Код: Выделить всё
public partial class TableDesignerUserControl : UserControl
{
private Point startPoint;
private Rectangle selectionRectangle;
private Border resizeBorder;
private bool isResizing = false;
private bool isDragging = false;
private string resizeDirection;
private bool _columnSeperator;
private bool _rowSeperator;
private bool gridGenerator;
private Grid selectedGrid;
private Dictionary gridDataMap = new Dictionary();
private List selectedCells = new List();
private List gridBorders = new List();
private Border activeBorder = null;
private bool isSelecting = false;
private bool isDeselecting = false;
private Border initialCell = null;
public TableDesignerUserControl()
{
InitializeComponent();
}
private void MainGrid_MouseDown(object sender, MouseButtonEventArgs e)
{
if (gridGenerator)
{
startPoint = e.GetPosition(MainGrid);
double imageWidth = imgDisplay.ActualWidth;
double imageHeight = imgDisplay.ActualHeight;
Point imagePosition = imgDisplay.TranslatePoint(new Point(0, 0), MainGrid);
if (startPoint.X < imagePosition.X || startPoint.X > imagePosition.X + imageWidth ||
startPoint.Y < imagePosition.Y || startPoint.Y > imagePosition.Y + imageHeight)
{
MessageBox.Show("Cannot draw outside the boundaries of the image.", "Alert", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
selectionRectangle = new Rectangle
{
Stroke = Brushes.Black,
StrokeDashArray = new DoubleCollection { 2 },
StrokeThickness = 1,
Width = 0,
Height = 0,
HorizontalAlignment = HorizontalAlignment.Left,
VerticalAlignment = VerticalAlignment.Top,
Margin = new Thickness(startPoint.X, startPoint.Y, 0, 0)
};
MainGrid.Children.Add(selectionRectangle);
}
else
{
if (e.OriginalSource is Border border && gridBorders.Contains(border))
{
activeBorder = border;
SelectGrid(activeBorder.Child as Grid);
return;
}
else if (e.OriginalSource is Grid grid && grid != MainGrid)
{
SelectGrid(grid);
return;
}
}
}
private void MainGrid_MouseMove(object sender, MouseEventArgs e)
{
if (selectionRectangle == null || isResizing || isDragging)
return;
var currentPoint = e.GetPosition(MainGrid);
double imageWidth = imgDisplay.ActualWidth;
double imageHeight = imgDisplay.ActualHeight;
Point imagePosition = imgDisplay.TranslatePoint(new Point(0, 0), MainGrid);
currentPoint.X = Math.Max(imagePosition.X, Math.Min(currentPoint.X, imagePosition.X + imageWidth));
currentPoint.Y = Math.Max(imagePosition.Y, Math.Min(currentPoint.Y, imagePosition.Y + imageHeight));
var minX = Math.Min(startPoint.X, currentPoint.X);
var minY = Math.Min(startPoint.Y, currentPoint.Y);
var width = Math.Abs(currentPoint.X - startPoint.X);
var height = Math.Abs(currentPoint.Y - startPoint.Y);
selectionRectangle.Margin = new Thickness(minX, minY, 0, 0);
selectionRectangle.Width = width;
selectionRectangle.Height = height;
}
private void MainGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
if (selectionRectangle != null && !isResizing && !isDragging)
{
var currentPoint = e.GetPosition(MainGrid);
double imageWidth = imgDisplay.ActualWidth;
double imageHeight = imgDisplay.ActualHeight;
Point imagePosition = imgDisplay.TranslatePoint(new Point(0, 0), MainGrid);
currentPoint.X = Math.Max(imagePosition.X, Math.Min(currentPoint.X, imagePosition.X + imageWidth));
currentPoint.Y = Math.Max(imagePosition.Y, Math.Min(currentPoint.Y, imagePosition.Y + imageHeight));
var minX = Math.Min(startPoint.X, currentPoint.X);
var minY = Math.Min(startPoint.Y, currentPoint.Y);
var width = Math.Abs(currentPoint.X - startPoint.X);
var height = Math.Abs(currentPoint.Y - startPoint.Y);
MainGrid.Children.Remove(selectionRectangle);
var border = new Border
{
Width = width,
Height = height,
BorderBrush = Brushes.Black,
BorderThickness = new Thickness(1),
Margin = new Thickness(minX, minY, 0, 0),
HorizontalAlignment = HorizontalAlignment.Left,
VerticalAlignment = VerticalAlignment.Top
};
var grid = new Grid
{
Background = Brushes.LightBlue,
Opacity = 0.3,
HorizontalAlignment = HorizontalAlignment.Stretch,
VerticalAlignment = VerticalAlignment.Stretch
};
AddResizeThumbs(grid);
grid.MouseLeftButtonDown += Grid_MouseLeftButtonDown;
border.Child = grid;
MainGrid.Children.Add(border);
grid.Margin = new Thickness(0);
SelectGrid(grid);
selectionRectangle = null;
gridBorders.Add(border);
activeBorder = border;
gridDataMap[grid] = new GridData(); // Initialize GridData for the new grid
}
}
private void SelectGrid(Grid grid)
{
if (grid == null)
return;
selectedGrid = grid;
selectedGrid.Background = Brushes.LightBlue;
selectedGrid.Opacity = 0.5;
foreach (var border in gridBorders)
{
if (border.Child != selectedGrid)
{
(border.Child as Grid).Background = Brushes.Gray;
(border.Child as Grid).Opacity = 0.3;
}
}
}
private void AddResizeThumbs(Grid container)
{
AddResizeThumb(container, Cursors.SizeWE, HorizontalAlignment.Right, VerticalAlignment.Stretch, "Right", 0, 0);
AddResizeThumb(container, Cursors.SizeNS, HorizontalAlignment.Stretch, VerticalAlignment.Bottom, "Bottom", 0, 0);
AddResizeThumb(container, Cursors.SizeWE, HorizontalAlignment.Left, VerticalAlignment.Stretch, "Left", 0, 0);
AddResizeThumb(container, Cursors.SizeNS, HorizontalAlignment.Stretch, VerticalAlignment.Top, "Top", 0, 0);
AddDraggingThumb(container, 0, 0);
}
private void AddResizeThumb(Grid container, Cursor cursor, HorizontalAlignment horizontalAlignment, VerticalAlignment verticalAlignment, string direction, double marginLeft, double marginTop)
{
var thumb = new Thumb
{
Width = 10,
Height = 10,
Opacity = 1,
Background = Brushes.White,
HorizontalAlignment = horizontalAlignment,
VerticalAlignment = verticalAlignment,
Cursor = cursor,
Tag = direction,
Margin = new Thickness(marginLeft, marginTop, 0, 0)
};
thumb.DragStarted += (s, e) =>
{
resizeBorder = (Border)container.Parent;
activeBorder = resizeBorder;
isResizing = true;
resizeDirection = (string)thumb.Tag;
MainGrid.Children.Remove(activeBorder);
MainGrid.Children.Add(activeBorder);
};
thumb.DragDelta += Thumb_DragDelta;
thumb.DragCompleted += (s, e) =>
{
isResizing = false;
resizeDirection = null;
};
container.Children.Add(thumb);
}
private void AddDraggingThumb(Grid container, double marginLeft, double marginTop)
{
var thumb = new Thumb
{
Width = 10,
Height = 10,
Opacity = 1,
Background = Brushes.Red,
HorizontalAlignment = HorizontalAlignment.Left,
VerticalAlignment = VerticalAlignment.Top,
Cursor = Cursors.SizeAll,
Margin = new Thickness(marginLeft, marginTop, 0, 0)
};
thumb.DragStarted += (s, e) =>
{
resizeBorder = (Border)container.Parent;
activeBorder = resizeBorder;
isDragging = true;
MainGrid.Children.Remove(activeBorder);
MainGrid.Children.Add(activeBorder);
};
thumb.DragDelta += Thumb_DragMove;
thumb.DragCompleted += (s, e) =>
{
isDragging = false;
};
container.Children.Add(thumb);
}
private void Thumb_DragDelta(object sender, DragDeltaEventArgs e)
{
if (resizeBorder == null || !isResizing)
return;
double newWidth, newHeight, newLeft, newTop;
double imageWidth = imgDisplay.ActualWidth;
double imageHeight = imgDisplay.ActualHeight;
Point imagePosition = imgDisplay.TranslatePoint(new Point(0, 0), MainGrid);
switch (resizeDirection)
{
case "Right":
newWidth = resizeBorder.Width + e.HorizontalChange;
if (newWidth > 0 && resizeBorder.Margin.Left + newWidth 0 && resizeBorder.Margin.Top + newHeight 0 && newLeft >= imagePosition.X)
{
resizeBorder.Width = newWidth;
resizeBorder.Margin = new Thickness(newLeft, resizeBorder.Margin.Top, 0, 0);
}
break;
case "Top":
newHeight = resizeBorder.Height - e.VerticalChange;
newTop = resizeBorder.Margin.Top + e.VerticalChange;
if (newHeight > 0 && newTop >= imagePosition.Y)
{
resizeBorder.Height = newHeight;
resizeBorder.Margin = new Thickness(resizeBorder.Margin.Left, newTop, 0, 0);
}
break;
}
AdjustGridCells();
}
private void Thumb_DragMove(object sender, DragDeltaEventArgs e)
{
if (resizeBorder == null || !isDragging)
return;
double newLeft = resizeBorder.Margin.Left + e.HorizontalChange;
double newTop = resizeBorder.Margin.Top + e.VerticalChange;
double imageWidth = imgDisplay.ActualWidth;
double imageHeight = imgDisplay.ActualHeight;
Point imagePosition = imgDisplay.TranslatePoint(new Point(0, 0), MainGrid);
if (newLeft >= imagePosition.X && newTop >= imagePosition.Y &&
newLeft + resizeBorder.Width
Подробнее здесь: [url]https://stackoverflow.com/questions/78696131/wpf-dynamic-data-grids-thumb-position-changed-when-row-and-column-definition-is[/url]
Мобильная версия