none
размер WPF Canvas RRS feed

  • Вопрос

  • Всем привет, немного глупый вопрос касательно размера xaml канвы. Влияет ли ее размер на производительность? У меня ПО с рисованием горизонтальных блок-схем и сейчас я решаю проблему с размером канвы у меня есть два решение, канва помещена в ScrollViewer

    1. (простое) Канва просто эпических размеров
    2. При перемещении объектов автоматически увеличивать канву

    Хотел поинтересоваться, какой вариант дешевле, и стоит ли на это вообще обращать внимание.

    21 сентября 2016 г. 4:21

Ответы

  • Добрый день.

    Собрал простенькое приложение. Вот разметка формы:

    <Window x:Class="WpfApplication3.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:WpfApplication3"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <ScrollViewer>
            <Canvas x:Name="cnTest" />
        </ScrollViewer>
    </Window>

    Вот код:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded;
        }
    
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            int n = 10000;
            cnTest.Width = n;
            cnTest.Height = n;
            var solidBrush = new SolidColorBrush(Colors.Green);
            for (int i = 0; i < n / 50; i++)
            {
                Line ln = new Line() { Stroke = solidBrush, StrokeThickness = 2, X1 = i * 50, X2 = i * 50, Y1 = 0, Y2 = 100 };
                cnTest.Children.Add(ln);
            }
        }
    }

    Установил n в 1000 и получил вот такое использование памяти:

    Увеличил n в 10 раз до 10000, т.е. площадь канвы стал больше в 100 раз, количество линий увеличилось в 10 раз:

    Размер используемой памяти в профилировщике как бы намекает, что зависимость если и есть, то слабая. Так-что ставьте эксперименты, может в вашем случае что и измениться, в моем примере объем памяти меняется очень слабо.

    21 сентября 2016 г. 7:45
    Отвечающий