В чем разница между StaticResources и DynamicResources в WPF? - PullRequest
3 голосов
/ 14 сентября 2009

В чем разница между StaticResources и DynamicResources в WPF?

РЕДАКТИРОВАТЬ: Этот код в файле XAML:

<ComboBox Canvas.Left="14" Style="{StaticResource ComboBoxStyle}"
          Canvas.Top="137" Height="33" Name="cmbItem" Width="170"
          SelectionChanged="cmbItem_SelectionChanged">
    <ComboBoxItem>Name</ComboBoxItem>
    <ComboBoxItem>Age</ComboBoxItem>
</ComboBox>

код ниже находится в файле словаря ресурсов

<Style x:Key="ComboBoxStyle" TargetType="{x:Type ComboBox}">

    <Setter Property="FocusVisualStyle" Value="{StaticResource ComboBoxFocusVisual}"/>

    <Setter Property="Foreground" Value="#FF436B13"/>
</Style>

Ответы [ 2 ]

6 голосов
/ 14 сентября 2009

Динамические ресурсы оцениваются при их использовании. Статические ресурсы оцениваются во время загрузки.

С MSDN :

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

Там гораздо больше подробностей о том, когда вы должны выбрать, какой вариант.

2 голосов
/ 14 сентября 2009

Из вашего комментария ниже ответ Джона:

Я получаю эту ошибку "Не удается найти ресурс с именем '{ComboBoxFocusVisual}'. Имена ресурсов чувствительны к регистру. Ошибка в объекте 'cmbItem' в файле разметки"

Я думаю, что ваш ресурс ComboBoxFocusVisual объявлен после ComboBoxStyle, поэтому расширение StaticResource не может его найти. Вы должны либо объявить его, прежде чем ссылаться на него, либо ссылаться на него с расширением DynamicResource

...