Страницы

Поиск по вопросам

вторник, 4 июня 2019 г.

Создать координатную сетку на Canvas

Есть Canvas. На него можно дропать изображения. Потом их двигать, изменять размеры и т.д. Вопрос. Как наилучшим образом создать и отобразить на Canvas сетку, размерами скажем 10 на 10 точек? И как потом к ней сделать "прилипание" расположенных на canvas контролов? При условии что:
свойство Background канвы занято цветом фона (что логично), и кисть туда не положишь. С DrawingBrush вообще проблемы, в том плане что на стареньком железе, на win XP, сетка нарисованная через DrawingBrush, не хочет рисоваться. А надо. На более современных компьютерах рисуется.
Уточняю по просьбам трудящихся. Нужен наиболее оптимальный способ (алгоритм) создать нарисованную сетку на элементе Canvas с использованием net3.5. И способ осуществить прилипание элементов канвы к ней. Я считал что простая отрисовка линий на канве будет подтормаживать.


Ответ

Если вам нужна сетка переменного размера, подпишитесь на изменение размеров Canvas'а и рисуйте вручную:


public YourControlConstructor() { InitializeComponent(); UpdateBackPattern(null, null); }
void UpdateBackPattern(object sender, SizeChangedEventArgs e) { var w = Background.ActualWidth; var h = Background.ActualHeight;
Background.Children.Clear(); for (int x = 10; x < w; x += 10) AddLineToBackground(x, 0, x, h); for (int y = 10; y < h; y += 10) AddLineToBackground(0, y, w, y); }
void AddLineToBackground(double x1, double y1, double x2, double y2) { var line = new Line() { X1 = x1, Y1 = y1, X2 = x2, Y2 = y2, Stroke = Brushes.Black, StrokeThickness = 1, SnapsToDevicePixels = true }; line.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased); Background.Children.Add(line); }
Для «прилипания» вам нужно проверять координаты перемещаемого объекта, и если они близки к сетке (то есть, x % <шаг сетки> < <расстояние прилипания> или x % <шаг сетки> > <шаг сетки> - <расстояние прилипания>) приводить его координату к кратной размеру сетки.

Комментариев нет:

Отправить комментарий