Когда на самом деле использовать Freeze () для элементов управления WPF? - PullRequest
1 голос
/ 04 ноября 2019

Должен ли я установить все кисти, которые я создаю, или назначить их в качестве фона для Freeze? А как насчет других пользовательских элементов управления, которые я не изменяю?

Freezable предоставляет событие Changed для уведомления наблюдателей о любых изменениях объекта. Замораживание Freezable может улучшить его производительность, поскольку ему больше не нужно тратить ресурсы на уведомления об изменениях. Замороженный Freezable также может быть разделен между потоками, тогда как замороженный Freezable не может.

Из этого кажется, что если мое приложение никогда не вносит никаких изменений в созданную кисть, то нет разницы в производительностиЯ установил заморозить это или нет. Я прав?

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Насколько вы можете, вы должны поместить любые кисти, которые будут значительно использоваться в одном или нескольких словарях ресурсов.

Пока вы не делаете часть кисти зависимой от чего-то переменного, этибудет автоматически заморожен. Объедините их в app.xaml, чтобы их можно было использовать во всем приложении.

Для большинства разработчиков WPF это наиболее распространенный способ замораживания, с которым они сталкиваются, и выполняется автоматически.

Есливы используете freezable, который не заморожен, тогда на измененное событие будет подписано, чтобы вызвать потенциальные изменения в представлении. Если вы заморозите его, тогда это событие не будет подписано, и поэтому оно более эффективно. Однако вам придется использовать множество незамерзших замораживаемых объектов, прежде чем вы, вероятно, заметите такую ​​проблему.

Если вы выполняете много графической обработки, например, пишете игру, то проходите замораживаемые объекты, такие как динамически создаваемые геометрии, изФоновые потоки в пользовательском интерфейсе, вероятно, будут представлять интерес и значимость. Однако вы можете написать множество бизнес-приложений, и вам никогда не придется делать подобные вещи.

Существует довольно ограниченный набор вещей, которые вы можете заморозить - они должны наследоваться от freezable. Пользовательские контролы этого не делают.
Если вы прочитаете список, вы, вероятно, потратите больше времени на размышления «что это такое», чем «ах, да, я вижу, как я замораживаю .... ThumbButtonInfo».

https://docs.microsoft.com/en-us/dotnet/api/system.windows.freezable?view=netframework-4.8

1 голос
/ 04 ноября 2019

Должен ли я установить все кисти, которые я создаю, или назначить их в качестве фона для Freeze?

Да, если вы не собираетесь их изменять. Это избавляет систему от необходимости следить за их изменениями, обновлять их соответствующие неуправляемые ресурсы, которые используются под капотом.

Поскольку замораживание Freezable объектов обеспечивает это преимущество в производительности, считается, что рекомендуется заморозитьих всякий раз, когда вы знаете, они не будут изменены.

Если, например, вы создаете Brush в фоновом потоке, вы должны заморозить его, чтобы иметь возможность назначить его свойству UIElement в потоке пользовательского интерфейса.

Убедитесь, что вы проверили значение свойства CanFreeze, как описано в документах .

Вы можете заморозить ресурсы XAML с помощью PresentationOptions: Freeze Attribute .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...