Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема размещения ресурса 
V
    Опции темы
Compositum
Дата 7.5.2010, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: 1
Всего: 1



Добрый день. Мне нужно написать библиотеку, содержащую в себе GUI, который будет мною использоваться в составе работы одного плагина. При этом я хочу активно использовать стили и шаблоны (весь GUI полностью пишу на XAML). Но есть одна проблема... Как известно, в XAML используемый в приложении ресурс должен быть определён до того, как в XAML-разметке встретится первая ссылка на него. Такие ресурсы я выношу в отдельный xaml-файл (словарь), после чего этот словарь следует подключить к ресурсам некоторого элемента - чаще всего окна или приложения. Предположим, что мне нужно связать моё некоторое окно MainWindow с ресурсом, например залинковать свойство Background окна. Куда мне подключить словарь ресурсов в этом случае? Выходит, что к объекту приложения, т.к. иначе получится что в моей XAML-разметке ссылка на ресурс встретится раньше, чем будет выполнена линковка к ресурсу (хотя XAML-дизайнер при этом отображает верный результат). Продемонстрирую проблему. 

Сначала покажу код словаря:
Код

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <LinearGradientBrush x:Key="windowBrush" StartPoint="0,0" EndPoint="0,1">
        <LinearGradientBrush.GradientStops>
            <GradientStop Color="Yellow" Offset="0"/>
            <GradientStop Color="Azure"  Offset="1"/>
        </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>
</ResourceDictionary>


Теперь показываю фрагмент кода окна и то, что вижу в дизайнере:

user posted image

На скрине видим, что я ссылаюсь на ресурс (строка 5) ранее, чем он определён (строка 10). Однако визуальный дизайнер студии всё показывает корректно.

Если нажать F5, то понятное дело - получу ошибку компиляции:
Цитата

Cannot find resource named '{windowBrush}'. Resource names are case sensitive.  Error at object 'AcadPlaginsManager.MainWindow' in markup file 'AcadPlaginsManager;component/mainwindow.xaml' Line 5 Position 9.


Конечно, я могу вынести ресурс за рамки моего класса MainWindow, определив его в ресурсах класса приложения и тогда XAML-отладчик всё нормально скомпилирует, но проблема в том, что поскольку я пишу GUI для плагина, то мне придётся в коде плагина создавать объект окна, прежде чем его открыть. Т.е. получается, что я программно буду создавать объект окна, в теле которого имеется линк на ресурс, определённый в теле приложения (которого к этому моменту ещё нет).
Показываю на примере кода:
Код

            MainWindow win = new MainWindow();
            App app = new App() { MainWindow = win };

Этот код выдаст ошибку в первой же строке, потому как win не имеет нужного ему ресурса, определённого в экземпляре класса App, но ещё к тому моменту не созданного...

Как вариант, можно было бы вынести привязку свойства окна после определения ресурсов, прописав её как-то так:
Код

    <Window.Background>
        {StaticResource ResourceKey=windowBrush}
    </Window.Background>

Но это схематичный код, на самом деле я не знаю, как правильно прописать привязку внутри тега <Window.Background>, если такое вообще возможно...

Как быть?

Это сообщение отредактировал(а) Compositum - 7.5.2010, 18:32
PM   Вверх
Compositum
Дата 7.5.2010, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: 1
Всего: 1



Вопрос снят, нужно делать так:
Код

    <Window.Background>
        <StaticResource ResourceKey="windowBrush" />
    </Window.Background>

Просто меня сбило с толку то, что в процессе набирания " <StaticResource..." дизайнер XAML не выводил мне подсказок, в свете чего я бросал набирать, решив, что такой вариант не верен.  smile 

PM   Вверх
-Mikle-
Дата 8.5.2010, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 13
Всего: 59



Можешь использовать DynamicResource.... Он позволяет:
1. сослаться не еще не существующий ресурс
2. отслеживать изменения этого ресурса



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Compositum
Дата 8.5.2010, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: 1
Всего: 1



Цитата(-Mikle- @ 8.5.2010,  14:47)
Можешь использовать DynamicResource.... Он позволяет:
1. сослаться не еще не существующий ресурс
2. отслеживать изменения этого ресурса

спасибо

Это сообщение отредактировал(а) Compositum - 8.5.2010, 15:10
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0440 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.