Порядок синтаксического анализа окна -> UserControl - PullRequest
0 голосов
/ 02 марта 2012

Предположим, у меня есть окно, отображающее UserControl.UserControl содержит TextBox, который должен ссылаться на именованный стиль, определенный в Window.Resources:

<Window.Resources>
    <Style TargetType="TextBlock" x:Key="myStyle">
        <Setter Property="FontSize" Value="20" />
    </Style>
</Window.Resources>

Если я сделаю:

<TextBlock Style="{StaticResource myStyle}">Hello</TextBlock>

исключение XamlParseException ('Предоставить значение в' системе.Windows.StaticResourceExtension 'выбросил исключение.') Будет выброшено при запуске приложения.

ЕСЛИ я изменяю ссылку на DynamicResource, все работает нормально:

<TextBlock Style="{DynamicResource myStyle}">Hello</TextBlock>

Сбой ссылки на StaticResource, потому что XAML в UserControl анализируется лексически перед окном, в котором он находится?Другими словами, что касается анализатора XAML, определены ли Windows.Resources после UserControl?

Спасибо!
Ben

1 Ответ

0 голосов
/ 02 марта 2012

Да, это правильно - синтаксический анализатор XAML чрезвычайно ограничен в том, что он может найти с расширением разметки StaticResource.Хотя дело не в порядке: каждый XAML-файл имеет свою область видимости и не может видеть другие ресурсы, если они находятся в разных файлах.Как вы указали, вы можете использовать DynamicResource вместо этого.Если вы хотите использовать преимущества StaticResource (в частности, поддержку времени разработки), вы также можете объединить словари (http://msdn.microsoft.com/en-us/library/system.windows.resourcedictionary.mergeddictionaries.aspx) в словаре ресурсов пользовательского элемента управления), чтобы указать синтаксический анализатор XAML на дополнительные «области» ресурсов, которые он должен учитывать.

Я думаю, что словари слияния могут не работать в этом конкретном случае, потому что, я подозреваю, что если вы объедините родительскую область в словарь дочерних ресурсов, вы можете получить дублирующую ошибку определения (я не проверял ее для этого конкретногохотя, может быть, XAML переопределяет чисто).

...