2012-05-31 3 views
3

У меня есть много «забавных» попыток сделать мои поля (и ширины) в моем XAML совместимыми вместе с другими полями в одном приложении и маржах в других приложениях в том же «комплекте» приложений.Есть ли существенные накладные расходы, определяя поля как статические ресурсы?

Так у меня появилась идея, чтобы определить поля, как staticresources:

<Thickness x:Key="MarginDetailTabPageContent">0</Thickness> 
<Thickness x:Key="MarginLeftHeader">2,4,2,2</Thickness> 
<Thickness x:Key="MarginAdditionalInfoOnTop">1,2,2,0</Thickness> 
<Thickness x:Key="MarginSmallHeaderOnTop">1,2,2,0</Thickness> 
<Thickness x:Key="MarginFieldWithAdditionalMarginOnTop">0,0,2,2</Thickness> 
<System:Double x:Key="WidthSmallField">70</System:Double> 

..и тогда я планирую использовать эти staticresources везде .. этикетки, TextBlocks, текстовые поля, checkboxed .. на почти все элементы управления в моем заявление.

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

Как-то, на мой взгляд, я решил, что использование staticresource - запись <TextBlock Margin="{StaticResource=MarginLeftHeader}" ... /> вместо <TextBlock Margin="2,4,2,2" ... /> - везде стоит хотя бы вызов некоторой функции для каждого используемого места. Это правильно?

Общий вопрос: сможет ли пользователь почувствовать какие-либо изменения в производительности (к худшему .. или к лучшему)?

ответ

1

StaticResource будет разрешен и назначен этому свойству во время загрузки XAML, который происходит до фактического запуска приложения. Он будет назначен только один раз, и любые изменения в словаре ресурсов игнорируются. Таким образом, нет существенной разницы в производительности; поведение поиска для этого ресурса аналогично для поиска во время компиляции.

+0

Обычно XAML загружается в метод InitializeComponent, который вызывается в конструкторе вашего компонента. Таким образом, поиск ресурсов выполняется при создании экземпляра окна/элемента управления/независимо, очевидно, в __runtime__. –

+0

Из библиотеки MSDN: 'Статический ресурс предоставляет значение для любого атрибута свойства XAML, просматривая ссылку на уже определенный ресурс. Поведение поиска для этого ресурса аналогично поиску во время компиляции. « – gliderkite

+0

Это не имеет никакого смысла для меня.Поиск ресурса 'StaticResource' выполняется во время выполнения. Вы можете легко проверить его, добавив ресурсы в «App.Resources», когда начнется ваше приложение, и используйте их в своем XAML. –

1

Наличие нескольких экземпляров <TextBlock Margin="2,4,2,2" ... /> в вашем приложении приведет к созданию нового и отдельного объекта Thickness для каждого из них.

Имея один ресурс Thickness, и несколько экземпляров <TextBlock Margin="{StaticResource MarginLeftHeader}" ... /> создадут только один объект Thickness с несколькими ссылками на него.

Несколько факторов:

  • Второй вариант будет использовать меньше памяти, чем первый (т.е. менее Thickness объектов в памяти).
  • Второй вариант упростит жизнь, если вы приступите к настройке полей вашего приложения по всему миру или предоставлению разных полей в разных ситуациях.
  • Я не уверен, какой вариант будет работать лучше - создание новых объектов Thickness против поиска ресурсов. Мое шестое чувство, что для простой Thickness структуры, первый вариант может реально работать лучше (в то время как он может быть различным для более сложных объектов на основе классов)

В целом, потому что вы имеете дело с простым Thickness структура только четырех значений double, различия в памяти и производительности, вероятно, будут довольно незначительными, так что сделайте в зависимости от того, что вы предпочитаете!

+1

'Толщина' на самом деле __struct__ (т. Е. Тип значения) и переносится по сложной схеме бокса/распаковки. Ваша точка с потреблением памяти довольно сложно проверить. –

+0

Следовательно, мой последний пункт об этом, скорее всего, пренебрежимо мал. – Ross

 Смежные вопросы

  • Нет связанных вопросов^_^