Использование библиотеки ресурсов

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

  • Командой меню File/Add/New Project оболочки добавьте к решению новый проект с именем UseLibraryResource по шаблону WPF Application и назначьте его стартовым командой Set as StartUp Project


увеличить изображение

  • В панели Solution Explorer раскройте узел проекта UseResource первого упражнения и перетащите из него мышью папку Images на корневой узел проекта UseLibraryResource. Оболочка скопирует эту папку вместе с содержимым в наш новый проект UseLibraryResource
  • Выделяя последовательно файлы рисунков в папке Images, установите (или проверьте) в панели Properties для них следующие свойства
    • FACE02.ICO, FACE04.ICO:
      • Build Action=Resource
      • Copy to Output Directory=Do not copy
    • 10440.jpg:
      • Build Action=None
      • Copy to Output Directory=Copy if newer
  • В панели Solution Explorer выделите узел проекта UseLibraryResource и щелкните на пиктограмме Show All Files этой панели для раскрытия дерева файлов проекта
  • Раскройте узел UseLibraryResource/bin/Debug и убедитесь, что он не содержит пока никаких файлов

  • В панели Solution Explorer вызовите контекстное меню для узла References и выполните команду Add Reference, чтобы вызвать окно подключения библиотечных сборок
  • В окне Add Reference откройте вкладку Projects, выделите сборку LibraryResource.dll и щелкните на кнопке OK

Ссылка на эту библиотеку будет подключена к текущему проекту UseLibraryResource и появится в его узле References.

  • Откомпилируйте (или запустите) пустой проект UseLibraryResource и в панели Solution Explorer щелкните на кнопке Refresh, чтобы обновить представление панели

Мы видим, что оболочка скопировала готовую библиотечную сборку LibraryResource.dll в один каталог с исполнимой сборкой UseLibraryResource.exe. Важно помнить, что для нормальной работы приложения, использующего ресурсы нашей библиотечной сборки (или нуждающегося в любой другой пользовательской библиотеке), файл LibraryResource.dll при развертывании на клиентской машине всегда должен находиться в одном каталоге с исполнимым файлом приложения. Либо при развертывании библиотеку нужно будет размещать и специальным образом регистрировать в глобальном хранилище сборок GAC (Global Assembly Cache) на клиентской машине, что гораздо сложнее (но выполнимо).

  • Заполните файл Window1.xaml проекта UseLibraryResource следующей разметкой
<Window x:Class="UseLibraryResource.Window1" xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:resLib="clr-namespace:LibraryResource;assembly=LibraryResource" Title="UseLibraryResource" MinHeight="300" MinWidth="300" Height="300" Width="300" WindowStartupLocation="CenterScreen" Background="{x:Static SystemColors.MenuBarBrush}"> <!-- Содержимое окна --> <StackPanel> <!-- Это не ресурс, а элемент визуального дерева --> <TextBlock HorizontalAlignment="Center" FontSize="18" FontWeight="Bold" Margin="0,0,0,5"> Применение ресурсов </TextBlock> <!-- Синтаксис подключения ресурсов как статических полей и свойств библиотеки по ключу --> <Label HorizontalAlignment="Center" Content="{DynamicResource {x:Static resLib:CustomResources.Title1Key}}" /> <Button Name="btn1" Padding="5" Margin="5" FontWeight="Bold" FontSize="16" Foreground="{DynamicResource {x:Static resLib:CustomResources.ForegroundBrushKey}}" Background="{DynamicResource {x:Static resLib:CustomResources.BackgroundBrushKey}}" Content="Только DynamicResource" /> <Button Name="btn2" Padding="5" Margin="5" FontWeight="Bold" FontSize="16" Foreground="{DynamicResource {x:Static resLib:CustomResources.ForegroundBrushKey}}" Background="{DynamicResource {x:Static resLib:CustomResources.BackgroundBrushKey}}" Content="Только DynamicResource" /> <!-- Синтаксис подключения ресурсов из ресурсного словаря библиотеки по имени ресурса --> <Label HorizontalAlignment="Center" Content="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type resLib:CustomResources}, ResourceId=Title2}}" /> <Button Click="Button_Click" Padding="5" Margin="5" FontWeight="Bold" FontSize="16" Foreground="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type resLib:CustomResources}, ResourceId=ForegroundBrush2}}" Background="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type resLib:CustomResources}, ResourceId=BackgroundBrush2}}" Content="Только DynamicResource" /> <Button Click="Button_Click" Padding="5" Margin="5" FontWeight="Bold" FontSize="16" Foreground="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type resLib:CustomResources}, ResourceId=ForegroundBrush2}}" Background="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type resLib:CustomResources}, ResourceId=BackgroundBrush2}}" Content="Только DynamicResource" /> </StackPanel></Window>
  • Переключите редактор разметки в режим Design - оболочка видит библиотечные ресурсы уже на этапе проектирования

  • Заполните файл Window1.xaml.cs проекта UseLibraryResource следующим процедурным кодом (код файла Window1.xaml.cs приводится целиком)
using System;using System.Windows;using System.Windows.Controls;using System.Windows.Media;using System.Windows.Media.Imaging; using LibraryResource;// Подключаем пространство имен библиотеки с ресурсами namespace UseLibraryResource{ public partial class Window1: Window { public Window1() { // Инициализация интерфейсных элементов InitializeComponent(); // Создаем и добавляем программно объекты ресурсов в коллекцию окна // //... alternateColor SolidColorBrush solidColorBrush = new SolidColorBrush(); solidColorBrush.Color = Colors.Blue; this.Resources.Add("alternateColor", solidColorBrush); // //... alternateImage ImageBrush imageBrush = new ImageBrush(); imageBrush.ImageSource = new BitmapImage(new Uri(@"Images\10440.jpg", UriKind.Relative)); imageBrush.TileMode = TileMode.Tile; imageBrush.ViewportUnits = BrushMappingMode.Absolute;// Не путать с ViewboxUnits imageBrush.Viewport = new Rect(0, 0, 32, 32); imageBrush.Opacity = 0.5D;// Можно и без D, преобразует неявно из float в double this.Resources.Add("alternateImage", imageBrush); // Регистрируем обработчики программно btn1.Click += btn1_Click; btn2.Click += btn2_Click; } // Используем внешние ресурсы void btn1_Click(object sender, RoutedEventArgs e) { CustomResources.changeResourceKeyFlag =!CustomResources.changeResourceKeyFlag; btn1.Foreground = btn1.TryFindResource(CustomResources.ForegroundBrushKey) as SolidColorBrush; btn1.Background = (ImageBrush)btn1.TryFindResource(CustomResources.BackgroundBrushKey); } // Используем внешние ресурсы void btn2_Click(object sender, RoutedEventArgs e) { CustomResources.changeResourceKeyFlag =!CustomResources.changeResourceKeyFlag; try { btn2.Foreground = btn2.FindResource(CustomResources.ForegroundBrushKey) as SolidColorBrush; btn2.Background = (ImageBrush)btn2.FindResource(CustomResources.BackgroundBrushKey); } catch (Exception exc) { MessageBox.Show(exc.Message); } } bool changeResourceFlag2 = true; private void Button_Click(object sender, RoutedEventArgs e) { // Приводим ссылку к типу Button Button btn = sender as Button; if (btn == null) return; if (changeResourceFlag2) { // Используем внутренние ресурсы окна btn.Foreground= (SolidColorBrush)this.Resources["alternateColor"]; btn.Background = (ImageBrush)this.Resources["alternateImage"]; } else { // Используем внешние ресурсы btn.Foreground = btn.TryFindResource(CustomResources.ForegroundBrushKey) as SolidColorBrush; btn.Background = (ImageBrush)btn.TryFindResource(CustomResources.BackgroundBrushKey); } changeResourceFlag2 =!changeResourceFlag2;// Готовим другой вариант } }}
  • Запустите и испытайте работу приложения UseLibraryResource, разберитесь с кодом

Не стоит забывать, что при извлечении ресурсов через ключи типа ComponentResourceKey следует всегда использовать обязательно динамические, а не статические ресурсы


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: