TryFindResource не может найти ресурс - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть настроенный элемент управления WPF, производный от UserControl. В разделе «Ресурсы» в моем файле XAML у меня есть несколько шаблонов и стилей, определенных для элементов, которые будут отображаться в моем пользовательском элементе управления.

Вот определение для одного из моих стилей рисования стрелки, направленной вниз.

    <Style x:Key="ArrowStyle" TargetType="Path">
        <Setter Property="Margin" Value="4"/>
        <Setter Property="Stretch" Value="Uniform"/>
        <Setter Property="HorizontalAlignment" Value="Center"/>
        <Setter Property="VerticalAlignment" Value="Center"/>
        <Setter Property="Data" Value="M 0 0 L 5 5 L 10 0 Z"/>
        <Setter Property="Fill" Value="{DynamicResource FormText}"/>
    </Style>

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

        Path Arrow = new Path();
        Arrow.Style = TryFindResource("ArrowStyle") as Style;

Однако вызов TryFindResource завершается неудачно, указывая, что он не может найти ресурс. Если я переместлю определенный стиль в App.xaml, он найдет его, но не тогда, когда это будет пользовательский элемент управления.

Что я делаю неправильно или отсутствует?

Обновление

Пользовательская кнопка, для которой я вызываю TryFindResource, находится в пользовательском элементе управления. Однако, поскольку я вызываю TryFindResource в конструкторе пользовательской кнопки, он фактически не будет находиться в пользовательском элементе управления во время вызова TryFindResource. После создания пользовательской кнопки она будет добавлена ​​в пользовательский элемент управления. Возможно, существует другой способ или место для размещения TryFindResource, чтобы он вызывался после того, как кнопка принадлежит элементу управления.

Ответы [ 3 ]

7 голосов
/ 23 ноября 2011

TryFindResource переходит логическое дерево вверх, к родительскому элементу, пока не будет достигнут корневой элемент.

Затем проверяются ресурсы приложения. Это тот, который вы положили во второй попытке, и сработал, потому что он был найден там.

Таким образом, когда вы говорите «TryFindResource (« ArrowStyle »)», он ищет стиль стрелки в своих родительских элементах вплоть до ресурсов окна, а затем - ресурсов приложения (глобальные ресурсы). не найдено, потому что ваш ресурс ArrowStyle не удовлетворяет вышеуказанным условиям.

Вы должны вызывать его в своем «настроенном элементе управления WPF, производном от UserControl» или его потомках.

Я думаю, что если вы не можете заставить его работать, просто переместите его в ресурсы приложения или добавьте словарь ресурсов в ресурсы приложения со всеми глобальными ресурсами (стилями):

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="....Your resources.xaml"/>
            <ResourceDictionary Source="....Your resources.xaml"/>
            <!-- Place further resources here -->
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
0 голосов
/ 23 ноября 2011

Обычно лучшим местом для загрузки ресурсов является переопределение OnApplyTemplate или обработчик события Loaded вместо конструктора. Это будет вести себя как то, что происходит, когда вы добавляете ссылку на ресурс в XAML: элемент управления создается и добавляется в визуальное дерево, а затем пытается разрешить ресурсы из любого места, где они могут быть объявлены в ресурсах любых родительских объектов. Как вы правильно сказали, когда запускается конструктор, ваша кнопка еще не была добавлена ​​в родительский элемент управления и поэтому не может видеть стиль.

0 голосов
/ 23 ноября 2011

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

Чтобы найти там ресурс с помощью кнопки, вы должны пройти по логическому дереву, чтобы получить родительский объект и вызвать из него TryFindResource. В противном случае, у вас есть только альтернатива, чтобы поставить стиль с помощью кнопки или в App.xaml.

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