С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
 Аватар для Rhoxolan
13 / 13 / 7
Регистрация: 16.12.2020
Сообщений: 247
WPF

Использование Canvas как основного контейнера

30.09.2022, 11:39. Показов 722. Ответов 9

Студворк — интернет-сервис помощи студентам
Здравствуйте. Не помню где, но слышал, что использование Canvas как основного контейнера, когда мы не оборачиваем его в Grid или какой-то еще контейнер в приложении WPF - плохая идея. Но почему? Понятное дело, если мы работаем с окном переменного размера, Canvas не подойдёт. Но если размер окна в приложении не будет меняться? Тогда Canvas будет допустимым решением? Или у этого решения все же могут быть свои подводные камни?

Добавлено через 11 минут
Для большей понятности, что я подразумеваю под основным контейнером:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Window x:Class="WpfApp1.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:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="600" Width="500">
    <Canvas>
        <Button Content="Button" Canvas.Left="10" Canvas.Top="10" HorizontalAlignment="Left" VerticalAlignment="Center" Width="79"/>
        <Button Content="Button" Canvas.Left="10" Canvas.Top="35" HorizontalAlignment="Left" VerticalAlignment="Center" Width="79"/>
        <Button Content="Button" Canvas.Left="10" Canvas.Top="60" Width="79" HorizontalAlignment="Center" VerticalAlignment="Top"/>
        <TextBox Canvas.Left="10" TextWrapping="Wrap" Text="TextBox" Canvas.Top="85" Width="480" HorizontalAlignment="Center" Height="489" VerticalAlignment="Top"/>
    </Canvas>
</Window>
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.09.2022, 11:39
Ответы с готовыми решениями:

WebBrowser, использование cookies из основного браузера
Использую WebBrowser для автоматического наблюдения за несколькими сайтами. Как только в html-коде одного из сайтов обнаруживается,...

Использование SD флешки в качестве основного накопителя в ноутбуке
Есть в наличии флешка Kingston microSDXC Canvas React Plus на 256 гб. Скорость передачи данных UHS-2 U3 На запись: 165 МБ/с На...

Использование стороннего контейнера
Помогите из этого кода, сделать нормальную прогу #ifndef _GLIBCXX_ARRAY #define _GLIBCXX_ARRAY 1 #pragma GCC system_header ...

9
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
30.09.2022, 15:48
Rhoxolan, ну а губку, для мытья посуды, обратной стороной будем использовать, как наждачную бумагу по дереву, -- в чём проблема, собственно?
0
 Аватар для Rhoxolan
13 / 13 / 7
Регистрация: 16.12.2020
Сообщений: 247
30.09.2022, 23:07  [ТС]
Цитата Сообщение от limeniye Посмотреть сообщение
Rhoxolan, ну а губку, для мытья посуды, обратной стороной будем использовать, как наждачную бумагу по дереву, -- в чём проблема, собственно?
Задача вполне выполнимая, но уйдет больше времени.

Соответственно, вы ведете к тому, что использовать Canvas - более трудоёмкая задача?

Но, повторюсь, я про ситуации, когда размер окна будет постоянным. И, наверное, я не до конца раскрыл свою мысль в вопросе - я не про ситуации со сложным интерфейсом, где будут использоваться панели с кнопками или что-то еще, где использование Grid-а напрашивается само собой.
Я скорее спрашиваю про ситуации, когда речь идет о очень простом приложении, где на окне, ну допустим, 5 кнопок и пару полей для ввода/вывода. Чем Canvas плох для таких ситуаций?
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
30.09.2022, 23:41
Лучший ответ Сообщение было отмечено Rhoxolan как решение

Решение

Rhoxolan, я веду к тому, что для всего свой функционал.

Смотря на Ваш код я задаюсь вопросом: зачем использовать Canvas.Left="10" Canvas.Top="10" вместо Margin="10,10"? Меняем на Margin и тут же второй вопрос: если у нас нет Canvas.Top и Canvas.Left, зачем нам Canvas? -- меняем на Grid.

Вот и вся логическая цепочка.

Теперь из различий Grid и Canvas.

Раз -- Canvas значительно тяжелее.
Два -- в Grid есть RowDefenition и ColumnDefenition, что в Вашей реализации с большей вероятностью пригодится, чем Canvas.Top и Canvas.Left.
Три -- размер окна у Вас то может быть и статический, но вот экран -- нет. Тут ещё важную роль отыгрывает Dpi.
В итоге Вы всё равно сталкнётесь с расхожедниями на разных мониторах. Не проверял, но это имхо.
1
 Аватар для Rhoxolan
13 / 13 / 7
Регистрация: 16.12.2020
Сообщений: 247
01.10.2022, 00:04  [ТС]
Цитата Сообщение от limeniye Посмотреть сообщение
Смотря на Ваш код я задаюсь вопросом: зачем использовать Canvas.Left="10" Canvas.Top="10" вместо Margin="10,10"?
Я просто вытянул три элемента для примера и совсем не хотел акцентировать на этом внимание. Хотя, да, уже в рабочей реализации было бы примерно так же.

Но в любом случае:
Цитата Сообщение от limeniye Посмотреть сообщение
Три -- размер окна у Вас то может быть и статический, но вот экран -- нет. Тут ещё важную роль отыгрывает Dpi.
В итоге Вы всё равно столкнётесь с расхождениями на разных мониторах.
Вот это уже по сути моего вопроса. За это я и спрашивал - за подводные камни, которые могут появиться в самых разных ситуациях.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
01.10.2022, 00:58
Цитата Сообщение от Rhoxolan Посмотреть сообщение
За это я и спрашивал
Это было имхо, точно я не знаю. Более компитентен в этом Элд Хасп, так как я видел темы, в которых он поднимал подобного рода вопрос про Dpi.
Посмотрим что ответит и верны ли мои догадки.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11242 / 2887
Регистрация: 21.04.2018
Сообщений: 33,047
Записей в блоге: 2
01.10.2022, 01:30
Лучший ответ Сообщение было отмечено Rhoxolan как решение

Решение

Rhoxolan, WPF отличается от Форм (в том числе) адаптивной разметкой.
То есть компоновка в нём должна быть "резиновой", относительной.
В вашем примере вы хотите задать "жёсткую" компоновку Окна постоянного размера.
НО! Стиль Окна по умолчанию определятся темой ОС. И в одном и том же приложении, но запускаемом, например в Win7 и Win10 вы получите визуально разные Окна.
Тоже самое может произойти при запуске на разных устройствах, разных мониторах. В том числе, как упомянул limeniye, из-за разного DPI.

А что для разметки означает разный стиль Окна?
Это может изменить размер КЛИЕНТСКОЙ области Окна.
То есть для окна с размерами Height="600" Width="500" вы можете получить разные размеры <Canvas>. Соответственно ваша "жёсткая компоновка" будет искажена: могут появиться ненужные поля или наоборот элементы "выедут" из зоны видимости.

Вроде бы это можно исправить такой компоновкой:
XML
1
2
3
Window ------------------
        Title="MainWindow"  SizeToContent="WidthAndHeight">
    <Canvas Height="600" Width="500">
НО!!!
Тема ОС может же поменять и шрифты по умолчанию, и стили элементов.
Может потребоваться локализация выводимого текста на элементах.
В результате вы можете получить разные размеры для дочерних элементов Canvas.
Как тогда подстроить размеры Canvas под рантайм размеры дочерних элементов?
Это можно, но достаточно сложно. Точно не для начинающих.
Гораздо проще задать адаптивную разметку через Grid.

Добавлено через 6 минут
Цитата Сообщение от limeniye Посмотреть сообщение
Раз -- Canvas значительно тяжелее.
Ну.... не думаю.
Мне кажется для построения компоновки Canvas самая простая панель.
В ней же ничего не надо рассчитывать, она не зависит от дочерних элементов.
Поэтому при вычислении компоновки проход по ним не требуется.
2
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
01.10.2022, 02:24
Цитата Сообщение от Элд Хасп Посмотреть сообщение
SizeToContent="WidthAndHeight"
Не знаю уместно ли, но я бы ещё предложил такой вариант: SnapsToDevicePixels="True"
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11242 / 2887
Регистрация: 21.04.2018
Сообщений: 33,047
Записей в блоге: 2
01.10.2022, 09:02
Цитата Сообщение от limeniye Посмотреть сообщение
я бы ещё предложил такой вариант: SnapsToDevicePixels="True"
Это пиксельное выравнивание.
Необходимо чтобы тонкие линии не размывались, если попадают на границу пикселей.
1
 Аватар для Rhoxolan
13 / 13 / 7
Регистрация: 16.12.2020
Сообщений: 247
01.10.2022, 09:53  [ТС]
Элд Хасп, limeniye, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.10.2022, 09:53
Помогаю со студенческими работами здесь

Использование контейнера list
Не могу из методички с задачками по контейнерам решить пару из них. Есть список целых чисел (std::list&lt;int&gt;). Нужно, за...

Использование контейнера ArrayList
Возникла проблема При использовании ArrayList using System; using System.Collections; using System.Linq; using System.Text; ...

Использование контейнера map
Доброе утро) Никак не пойму как пользоваться контейнером map и зачем он, вообще, нужен?! Скажем есть у меня такая программа(или точнее...

Использование IoC контейнера
Когда то давно, смотрел в сторону разработки бэк-энда на Java, где пожалуй самый популярный фреймворк - это Spring. Одной из основных его...

Использование контейнера map
строка 3 → Как определяется объект класи map? void ZLab10::mapa() { map&lt;char,double&gt; pomiary; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru