powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Есть ли смысл масштабировать элементы размещаемые на Canvas?
12 сообщений из 12, страница 1 из 1
Есть ли смысл масштабировать элементы размещаемые на Canvas?
    #39938085
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Размещаю набор элементов (прямоугольники, окружности) на канвасе, потом канвас масштабируется через ScaleTransform (по вращению колеса мыши). Имеет ли значение смасштабирую я элементы до размещения на канвасе, чтобы размер канваса был меньше (допустим 600х800) или размещу элементы в тех единицах которые удобны мне (допустим прямоугольник 3000х6000мм), получу канвас 4000х7000 и потом уже смаштабирую канвас? Если я правильно понимаю - и канвас и прямоугольники-окружности в WPF векторные, от их размера и масштаба ни занимаемая память, ни скорость работы не зависят и можно работать в тех единицах, что мне удобны?
...
Рейтинг: 0 / 0
Есть ли смысл масштабировать элементы размещаемые на Canvas?
    #39938134
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Есть ли смысл масштабировать элементы размещаемые на Canvas?
    #39938149
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
Да, я знаю этот компонент. Он хорошо подходит для статического вписывания, но не для масштабирования колесом мыши.
Но вопрос даже не в этом - пусть будет ViewBox. Имеет ли значение, помещу я в него Canvas 600х800 или 6000х8000 если на данном канвасе только один прямоугольник с размером 500х700 и 5000х7000 соответственно? Имеет ли смысл масштабировать сначала "руками" прямоугольник до подходящего размера канваса, а потом уже масштабировать канвас? Или если канвас масштабируется, то неважен его первоначальный размер?
Будут ли одинаково обрабатываться:
1. Канвас 600х800 scale=1.
2. Канвас 6000х8000 scale=0.1
...
Рейтинг: 0 / 0
Есть ли смысл масштабировать элементы размещаемые на Canvas?
    #39938242
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений, Екатеринбург,

вам нужно исходить от единой точки отсчета
есть некая система координат, путь это будет канвас
у неё есть размер и все объекты в ней должны быть в рамках этой системы.
то есть вы добавляете в нее shape'ы такого размера и в таком положении, какой является исходная система координат.
а матрица трансформации будет воздействовать на все элементы внутри Canvas, зачем вам увеличивать и рассчитывать размеры новых элементов, если матрица трансформации воздействует на всё содержимое?

если вы масштабируйте элемент управления, на память это сильно не влияет, но не забывайте, что каждый элемент управления в результате Render'инга имеет BitmapCache. То есть, в памяти хранится битмап результирующая картинка, но думать об этом особо сильно не надо.

Hit-тестинг и получение координат надо делать через встроенные инструменты, как и в 3д с помощью матрицы проекции, это делает и в 2д, к координатам клика применяются те же преобразования и т.д.

посмотри вот тут:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/d7221b3c-8f86-4c50-bff7-61dbdf2611d9/hittesting-after-scaletransform?forum=wpf

даже интересно стало, опишите подробнее, что хотите получить, редактор графики или что?
...
Рейтинг: 0 / 0
Есть ли смысл масштабировать элементы размещаемые на Canvas?
    #39938254
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
Спасибо. Т.е. получается, что если у меня допустим физически элементы размером 5000мм, то мне лучше завести канвас соответствующего размера - 6000х6000 допустим, разместить элемент в принятых единицах измерения (мм) и далее уже масштабировать канвас. И это не будет являться моветоном в программировании?
автордаже интересно стало, опишите подробнее, что хотите получить, редактор графики или что?
Типа того - отображение элементов строительных конструкций и напряжений в них
...
Рейтинг: 0 / 0
Есть ли смысл масштабировать элементы размещаемые на Canvas?
    #39938259
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас у меня так делается - в метод передаю канвас и определяю масштаб
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
        /// <summary>
        /// Рисование эскиза в плане
        /// </summary>
        /// <param name="foundation">Фундамент</param>
        /// <param name="canvas">Канвас, на котором происходит рисование</param>
        public static void DrawTopScatch(Foundation foundation, Canvas canvas)
        {
            canvas.Children.Clear();
            double[] sizes = FoundationProcessor.GetContourSize(foundation);
            //Проверка на действительность размеров необходима для правильного вычисления масштаба
            //Если ступеней нет, то ничего не рисуем
            if (sizes[0] > 0 & sizes[1] > 0)
            {
                double zoom_factor_X = canvas.Width / sizes[0] / 1.2;
                double zoom_factor_Y = canvas.Height / sizes[1] / 1.2;
                double scale_factor;
                if (zoom_factor_X < zoom_factor_Y) { scale_factor = zoom_factor_X; } else { scale_factor = zoom_factor_Y; }
                double[] AxisCenter = new double[2] { canvas.Width / 2, canvas.Height / 2 };
                int count = foundation.Parts.Count;
                for (int i = 0; i < count; i++)
                {
                    double opacity = 0.6;
                    if (i == count - 1) { opacity = 1.0; }
                    DrawTopFoundationPart(foundation.Parts[count - i - 1], canvas, AxisCenter, scale_factor, 1, 1, opacity);
                }
            }
            // Рисуем оси координат
            DrawUtils.DrawAxis(canvas, true, true);
        }

...
Рейтинг: 0 / 0
Есть ли смысл масштабировать элементы размещаемые на Canvas?
    #39938347
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений, Екатеринбург , для вашей задачи, без вариантов - создаёте целиком поле в удобных координатах Canvas со всеми элементами и масштабируйте Canvas целиком.

И почему вы не хотите использовать ViewBox?
По мне - очень удобно и не знаю, что может препятствовать его применению.
...
Рейтинг: 0 / 0
Есть ли смысл масштабировать элементы размещаемые на Canvas?
    #39938377
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld Hasp,
Мне нужно увеличивать изображение колесом мыши и скролить его, viewbox это не делает.
...
Рейтинг: 0 / 0
Есть ли смысл масштабировать элементы размещаемые на Canvas?
    #39938435
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не уверен, будет ли полезен вам данный пример, но гляньте :)

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
<Window x:Class="ScaleScrolling.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ScaleScrolling"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>

        <local:ScrollViewerEx HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" CanContentScroll="True"
                      MouseWheel="ScrollViewer_PreviewMouseWheel"
                      PreviewMouseDown="ScrollViewerEx_PreviewMouseDown"
                      PreviewMouseUp="ScrollViewerEx_PreviewMouseUp"
                      PreviewMouseMove="ScrollViewerEx_PreviewMouseMove">
                <Canvas PreviewMouseWheel="Canvas_PreviewMouseWheel" Width="300" Height="300">
                    <Canvas.LayoutTransform>
                        <ScaleTransform x:Name="PART_ScaleTransform"/>
                    </Canvas.LayoutTransform>
                    <Rectangle Canvas.Left="20" Canvas.Top="20" Fill="Red" Stroke="Black" Width="200" Height="200"/>
                    <Rectangle Canvas.Left="50" Canvas.Top="50" Fill="Green" Stroke="Black" Width="200" Height="200"/>
                    <Rectangle Canvas.Left="80" Canvas.Top="80" Fill="Blue" Stroke="Black" Width="200" Height="200"/>
                </Canvas>
        </local:ScrollViewerEx>
    </Grid>
</Window>



код формы в код бихайнд файле
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace ScaleScrolling
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Canvas_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
        {
            var mousePosition = e.GetPosition((IInputElement)sender);
            PART_ScaleTransform.CenterX = mousePosition.X;
            PART_ScaleTransform.CenterY = mousePosition.Y;
            if (e.Delta > 0)
            {
                PART_ScaleTransform.ScaleX += 0.1;
                PART_ScaleTransform.ScaleY += 0.1;
            }
            else
            {
                PART_ScaleTransform.ScaleX -= 0.1;
                PART_ScaleTransform.ScaleY -= 0.1;
            }
        }

        private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
        {
            e.Handled = true;
        }

        private Point _startMovingPoint;
        private double _startHorizontalOffset;
        private double _startVerticalOffset;
        private bool _startMoving;
        private void ScrollViewerEx_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            var scrollViewer = (ScrollViewer)sender;
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                scrollViewer.CaptureMouse();
                _startMovingPoint = e.GetPosition((IInputElement)sender);
                _startHorizontalOffset = scrollViewer.HorizontalOffset;
                _startVerticalOffset = scrollViewer.VerticalOffset;
                _startMoving = true;

            }
        }

        private void ScrollViewerEx_PreviewMouseUp(object sender, MouseButtonEventArgs e)
        {
            var scrollViewer = (ScrollViewer)sender;
            if (scrollViewer.IsMouseCaptured)
            {
                scrollViewer.ReleaseMouseCapture();
                _startMoving = false;
            }
        }

        private void ScrollViewerEx_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            var scrollViewer = (ScrollViewer)sender;
            if (_startMoving && e.LeftButton == MouseButtonState.Pressed)
            {
                var point = e.GetPosition((IInputElement)sender);
                var delta = point - _startMovingPoint;
                scrollViewer.ScrollToHorizontalOffset(_startHorizontalOffset - delta.X);
                scrollViewer.ScrollToVerticalOffset(_startVerticalOffset - delta.Y);
            }
        }
    }
}



Блокируем обработку колеса в ScrollViewer'е, а то он падла постоянно хочет прокручиваться, может как то можно умнее сделать, но мне было лень разбираться.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
using System.Windows.Controls;
using System.Windows.Input;

namespace ScaleScrolling
{
    public class ScrollViewerEx : ScrollViewer
    {
        protected override void OnMouseWheel(MouseWheelEventArgs e) { }
    }
}



...
Рейтинг: 0 / 0
Есть ли смысл масштабировать элементы размещаемые на Canvas?
    #39938516
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes, Спасибо огромное - то что нужно. Хотя я тоже думаю, что должен быть способ со стандартными классами, без наследования ScrollViewer
...
Рейтинг: 0 / 0
Есть ли смысл масштабировать элементы размещаемые на Canvas?
    #39938542
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений, Екатеринбург
Roman Mejtes, Спасибо огромное - то что нужно. Хотя я тоже думаю, что должен быть способ со стандартными классами, без наследования ScrollViewer


Посмотрите несколько примеров моих реализаций

https://www.cyberforum.ru/wpf-silverlight/thread2573138.html#post14191974

https://www.cyberforum.ru/wpf-silverlight/thread2465874.html#post13632736

https://www.cyberforum.ru/wpf-silverlight/thread2565250.html#post14148901
...
Рейтинг: 0 / 0
Есть ли смысл масштабировать элементы размещаемые на Canvas?
    #39938803
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld Hasp, Благодарю - посмотрю, думаю пригодится.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Есть ли смысл масштабировать элементы размещаемые на Canvas?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]