2014-12-24 2 views
1

У нас есть много сложных Path s в нашем приложении WPF. Примером может быть:Как заморозить данные пути

<Path Data="M14.077,9.772C11.634,9.772 9.652,11.753 9.652,14.197 9.652,16.641 11.634,18.622 14.077,18.622 16.521,18.622 18.502,16.641 18.502,14.197 18.502,11.753 16.521,9.772 14.077,9.772 M28,12L28,16 24.085,16C23.84,17.369,23.325,18.643,22.592,19.763L25.313,22.485 22.485,25.314 19.791,22.62C18.668,23.383,17.383,23.924,16,24.189L16,28 12,28 12,24.163C10.638,23.88,9.378,23.322,8.274,22.554L5.514,25.314 2.686,22.485 5.504,19.668C4.802,18.57,4.306,17.331,4.068,16L0,16 0,12 4.144,12C4.427,10.722,4.943,9.533,5.656,8.485L2.686,5.515 5.514,2.686 8.513,5.684C9.558,5,10.734,4.499,12,4.236L12,0 16,0 16,4.21C17.285,4.456,18.48,4.946,19.545,5.626L22.485,2.686 25.313,5.515 22.431,8.397C23.176,9.467,23.718,10.685,24.008,12z" Fill="{TemplateBinding Foreground}" Height="12" Width="12" Stretch="Fill" VerticalAlignment="Center" HorizontalAlignment="Right"/> 

Большинство наших шаблонов управления требуют широкого использования векторной графики и множественного эффекта применяются на этих путях.

По соображениям производительности мы хотим заморозить Data этих путей, так как он не будет изменен. Этот синтаксис, который мы используем, создает StreamGeometry и присваивает ему данные. StreamGeometry является замораживаемым, но как мы можем его заморозить в нашем xaml?

+1

StreamGeometry уже заморожен, когда он создан в XAML путем разметки пути. – Clemens

+0

@ Clemens Спасибо. Сначала я подумал. Но как мы можем убедиться, что объект заморожен во время выполнения, чтобы быть уверенным? И любые ссылки по этому вопросу? – SepehrM

+0

@Clemens Вы правы. 'Path.Data.IsFrozen' возвращает true. – SepehrM

ответ

1

Вы можете использовать атрибут PresentationOptions:Freeze="True". Вы можете больше узнать об этом here.

Резюме от MSDN:

Устанавливает состояние IsFrozen истины на содержащий Freezable элемента. Поведение по умолчанию для Freezable без Атрибут PresentationOptions: Freeze указан в том, что IsFrozen равен false во время загрузки и зависит от общего поведения Freezable при времени выполнения.

Установка IsFrozen в true точно такая же, как и вызов Freeze() на объект Freezable.

В вашем случае вам необходимо установить, чтобы PathGeometry была заморожена.

<Path> 
    <Path.Data> 
     <PathGeometry PresentationOptions:Freeze="True" 
      Figures="..." /> 
    </Path.Data> 
</Path> 
+0

Спасибо. Но как установить это для данных? Не '' означает «Замораживание объекта Path»? «Путь» не является замораживаемым, но его «Данные» есть. – SepehrM

+0

См. Обновленный ответ. Редактировать: комментарий @Clemens указывает, что StreamGeometry замораживается по умолчанию при использовании разметки атрибутов данных. Я этого не знал! Я сохраню этот ответ здесь, если кто-то не использует синтаксис Data. –

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