Страницы

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

воскресенье, 15 марта 2020 г.

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

#c_sharp #wpf


Есть Canvas. На него можно дропать изображения. Потом их двигать, изменять размеры
и т.д. Вопрос. Как наилучшим образом создать и отобразить на Canvas сетку, размерами
скажем 10 на 10 точек? И как потом к ней сделать "прилипание" расположенных на canvas
контролов? При условии что:


свойство Background канвы занято цветом фона (что логично), и кисть туда не положишь.
С DrawingBrush вообще проблемы, в том плане что на стареньком железе, на win XP,
сетка нарисованная через DrawingBrush, не хочет рисоваться. А надо. На более современных
компьютерах рисуется.


Уточняю по просьбам трудящихся. Нужен наиболее оптимальный способ (алгоритм) создать
нарисованную сетку на элементе Canvas с использованием net3.5. И способ осуществить
прилипание элементов канвы к ней. Я считал что простая отрисовка линий на канве будет
подтормаживать.
    


Ответы

Ответ 1



Если вам нужна сетка переменного размера, подпишитесь на изменение размеров 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 % <шаг сетки> > <шаг сетки> - <расстояние прилипания>) приводить его координату к кратной размеру сетки.

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

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