|
Программирование >> Windows foundation
<StackPanel> <StackPanel.Resources> <LinearGradientBrush x:Key= MyGradientBrush StartPoint= 0.5,0 EndPoint= 0.5,1 > <GradientStop Offset= 0.0 Color= LightCyan /> <GradientStop Offset= 0.14 Color= Cyan /> <GradientStop Offset= 0.7 Color= DarkCyan /> </LinearGradientBrush> </StackPanel.Resources> <Button Name= button1 Width= 200 Height= 50 Foreground= White Background= {StaticResource MyGradientBrush} > Click Me! </Button> </StackPanel> </Window> Здесь ресурсы определены в StackPanel. В предыдущем примере ресурсы были определены в элементе Window. Базовый класс FrameworkElement определяет свойство Resources типа ResourceDictionary. Вот почему ресурсы могут быть определены для каждого класса, унаследованного от FrameworkElement, т.е. для любого элемента WPF. Поиск ресурсов осуществляется иерархически. Если вы определите ресурс в окне, он применяется к каждому дочернему элементу окна. Если Window содержит Grid, а Grid содержит StackPanel, и вы определили ресурс для StackPanel, то этот ресурс применяется ко всем элементам управления внутри StackPanel. Если StackPanel содержит Button, и вы определяете ресурсы только для Button, то стиль будет распространяться только на кнопку. Из-за иерархии вам следует быть внимательнкми, если вы используете TargetType без Key для стилей. Если вы определяете ресурсы для элемента Canvas и установите TargetType для стиля так, что он будет применяться к элементам TextBox, то стиль будет распространяться на все элементы TextBox в пределах Canvas. Этот стиль даже будет касаться элементов TextBox, содержащихся в ListBox, если ListBox находится в том же Canvas. Если вам нужен одинаковый стиль более чем для одного элемента Window, вы можете определить стиль на уровне приложения. В WPF-проекте Visual Studio создается файл App.xml для определения глобальных ресурсов приложения. Стили приложения действуют для всех окон приложения; каждый элемент может обращаться к ресурсам, определенным в приложении. Если ресурсы не найдены в родительском окне, поиск ресурсов продолжается в Application. <Application x:Class= ResourcesSample.App xmlns= http: schemas.microsoft.com/winfx/2 00 6/xaml/presentation xmlns:x= http: schemas.microsoft.com/winfx/2 006/xaml StartupUri= Window1.xaml > <Application.Resources> </Application.Resources> </Application> Системные ресурсы Существует также несколько ресурсов уровня системы, используемых для установки цветов и шрифтов, которые доступны всем приложениям. Эти ресурсы определены в классах SystemColors, SystemFonts и SystemParameters. □ С SystemColors вы получаете, настройки цвета для рамок, элементов управления, рабочего стола и окон, например, ActiveBorderColor, ControlBrush, DesktopColor, WindowColor, WindowBrush и тому подобного. □ Класс SystemFonts возвращает настройки шрифтов меню, линейки статуса и окна сообщений, например, CaptionFont, DialogFont, MenuFont, MessageBoxFont, StatusFont и т.д. □ Класс SystemParameters представляет настройки размеров кнопок меню, курсоров, пиктограмм, заголовков рамок, информации о времени и настройки клавиатуры, например, BorderWidth, CaptionHeight, CaptionWidth, MenuButtonWidth, MenuPopupAnimation, MenuShowDelay, SmallIconHeight, SmallIconWidth и т.д. На рис. 34.20 показан диалог, в котором пользователь может конфигурировать эти настройки. Вы можете получить доступ к диалоговому окну Appearance (Внешний вид) через настройки Personalization (Персонализация) панели управления. Рис. 34.20. Диалоговое окно Appearance Обращение к ресурсам из кода Чтобы обратиться к ресурсам из отделенного кода, базовый класс FrameworkElement реализует метод FindResource(), так что вы можете вызывать этот метод с каждым объектом WPF. Чтобы показать, как это делается, мы не будем специфицировать фон для button2, но событию Click назначим метод OnApplyResource. <StackPanel Name= MyContainer > <StackPanel.Resources> <LinearGradientBrush x:Key= MyGradientBrush StartPoint= 0.5,0 EndPoint= 0.5,1 > <GradientStop Offset= 0.0 Color= LightCyan /> <GradientStop Offset= 0.14 Color= Cyan /> <GradientStop Offset= 0.7 Color= DarkCyan /> </LinearGradientBrush> </StackPanel.Resources> <Button Name= button2 Width= 200 Height= 50 Click= button1 Click > Apply Resource Programmatically </Button> В реализации метода OnAPplyResource() воспользуемся методом FindResource() для кнопки, на которой был совершен щелчок. При этом произойдет иерархический поиск ресурса MyGradientBrush, и кисть будет применена к свойству Background элемента управления. public void OnApplyResource(object sender, RoutedEventArgs e) Control ctrl = sender as Control; ctrl.Background = ctrl.FindResource( MyGradientBrush ) as Brush; Если FindResource() не находит ключа ресурса, возбуждается исключение. Если вы не знаете точно, доступен ли ресурс, то можете использовать вместо этого метод TryFindResource(). Метод TryFindResource() возвратит null, если не сможет найти ресурс. Динамические ресурсы С расширением разметки StaticResource поиск ресурсов осуществляется во время загрузки. Если ресурс должен измениться во время работы программы, вам следует использовать вместо этого расширение разметки DynamicResource. В следующем примере используется тот же ресурс, определенный ранее. button1 использует ресурс как StaticResource, а button3 - как DynamicResource с расширением разметки DynamicResource. Кнопка button2 применяется для программного изменения ресурса. У нее есть обработчик события Click, которым назначен метод button2 Click. <Button Name= button1 Width= 200 Height= 50 Background= {StaticResource MyGradientBrush} > Static Resource </Button> <Button Name= button2 Width= 200 Height= 50 Click= button2 Click > Change Resource </Button> <Button Name= button3 Width= 200 Height= 50 Background= {DynamicResource MyGradientBrush} > Dynamic Resource </Button> Реализация button2 Click() очищает ресурсы StackPanel и добавляет новый ресурс с тем же именем - MyGradientBrush. Этот новый ресурс очень похож на ресурс, определенный в коде XAML; он просто определяет разные цвета. public void OnChangeResource(object sender, RoutedEventArgs e) MyContainer.Resources.Clear(); LinearGradientBrush brush = new LinearGradientBrush(); brush.StartPoint = new Point(0.5, 0); brush.EndPoint = new Point(0.5, 1); GradientStopCollection stops = new GradientStopCollection(); stops.Add(new GradientStop(Colors.White, 0.0)); stops.Add(new GradientStop(Colors.Yellow, 0.14)); stops.Add(new GradientStop(Colors.YellowGreen, 0.7)); brush.GradientStops = stops; MyContainer.Resources.Add( MyGradientBrush , brush); Если вы запустите это приложение и измените ресурс динамически - щелчком на третьей кнопке, то button4 немедленно получит новый ресурс. При этом кнопка button1, использующая StaticResource, останется со старым ресурсом, который был загружен первоначально.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |