Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
course_(Windows&Web).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.68 Mб
Скачать

Шаг 2. Динамическое применение стилей в коде приложения

Стили также можно создавать и применять динамически в коде приложения. Давайте посмотрим на простой пример создания такого стиля.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace StylesAndResources {     /// <summary>     /// Interaction logic for MainWindow.xaml     /// </summary>     public partial class MainWindow : Window     {         public MainWindow()         {             InitializeComponent();         }

        private void OnResources(object sender, RoutedEventArgs e)         {             new ResourceDemo().Show();         }     } }

<Window x:Class="StylesAndResources.ResourceDemo"         xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation         xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml         Title="Resource Demo" Height="300" Width="300"> <StackPanel x:Name="myContainer">         <StackPanel.Resources>             <LinearGradientBrush x:Key="MyGradientBrush"  StartPoint="0,0" EndPoint="0.3,1">                 <GradientStop Offset="0.0" Color="LightCyan" />                 <GradientStop Offset="0.14" Color="Cyan" />                 <GradientStop Offset="0.7" Color="DarkCyan" />             </LinearGradientBrush>         </StackPanel.Resources>         <Button Width="200" Height="50" Foreground="White" Margin="5"  Background="{StaticResource MyGradientBrush}" Content="Click Me!" />        <Button Name="button1" Width="220" Height="50" Margin="5"  Click="button1_Click"/>         <Button Name="button2" Width="200" Height="50" Foreground="White"  Margin="5" Background="{DynamicResource MyGradientBrush}" Content="Change Resource" Click="button2_Click" />     </StackPanel> </Window>

Создадим еще одну страницу и реализуем обработчик первой кнопки так, чтобы при нажатии на нее открывалась новая страница:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace StylesAndResources {     /// <summary>     /// Interaction logic for MainWindow.xaml     /// </summary>     public partial class MainWindow : Window     {         public MainWindow()         {             InitializeComponent();         }         private void OnResources(object sender, RoutedEventArgs e)         {             new ResourceDemo().Show();         }     } }

<Window x:Class="StylesAndResources.ResourceDemo"         xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation         xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml         Title="Resource Demo" Height="300" Width="300">     <StackPanel x:Name="myContainer">         <StackPanel.Resources>             <LinearGradientBrush x:Key="MyGradientBrush"  StartPoint="0,0" EndPoint="0.3,1">                 <GradientStop Offset="0.0" Color="LightCyan" />                 <GradientStop Offset="0.14" Color="Cyan" />                 <GradientStop Offset="0.7" Color="DarkCyan" />             </LinearGradientBrush>         </StackPanel.Resources>         <Button Width="200" Height="50" Foreground="White"  Margin="5" Background="{StaticResource MyGradientBrush}" Content="Click Me!" />         <Button Name="button1" Width="220" Height="50" Margin="5"  Click="button1_Click"/> <Button Name="button2"  Width="200" Height="50" Foreground="White"  Margin="5"  Background="{DynamicResource MyGradientBrush}"  Content="Change Resource" Click="button2_Click" /> </StackPanel> </Window>

Тут мы задали стиль MyGradientBrush и у нас есть три кнопки. Для первой мы просто используем этот стиль. А для остальных будем менять его динамически.

В обработчике нажатия на первую кнопку нам нужно найти стиль MyGradientBrush и применить его к текущей кнопке.

        private void button1_Click(object sender, RoutedEventArgs e)         {             Control ctrl = sender as Control;             ctrl.Background = ctrl.FindResource("MyGradientBrush") as Brush;         }

Для второй кнопки мы создадим несколько другой алгоритм. Сначала мы очистим всю коллекцию стилей для данной страницы. После этого мы создадим кисть и добавим ее в коллекцию стилей сстриницы.

        private void button2_Click(object sender, RoutedEventArgs e)         {             myContainer.Resources.Clear();             var brush = new LinearGradientBrush {  StartPoint = new Point(0, 0), EndPoint = new Point(0, 1) };             brush.GradientStops = new GradientStopCollection()             {                 new GradientStop(Colors.White, 0.0),                 new GradientStop(Colors.Yellow, 0.14),                 new GradientStop(Colors.YellowGreen, 0.7)             };             myContainer.Resources.Add("MyGradientBrush", brush);        }

Обратите внимание на то, что теперь новый стиль будет применяться и к кнопке button1, в то время как кпопка со статическим стилем не изменится.

Весь код этой страницы выглядит вот так:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes;

namespace StylesAndResources {     /// <summary>     /// Interaction logic for ResourceDemo.xaml     /// </summary>     public partial class ResourceDemo : Window     {         public ResourceDemo()         {             InitializeComponent();         }

       private void button1_Click(object sender, RoutedEventArgs e)         {             Control ctrl = sender as Control;             ctrl.Background = ctrl.FindResource("MyGradientBrush") as Brush;         }         private void button2_Click(object sender, RoutedEventArgs e)         {             myContainer.Resources.Clear();             var brush = new LinearGradientBrush { StartPoint =  new Point(0, 0, EndPoint = new Point(0, 1) };             brush.GradientStops = new GradientStopCollection()             {                 new GradientStop(Colors.White, 0.0),                 new GradientStop(Colors.Yellow, 0.14),                 new GradientStop(Colors.YellowGreen, 0.7)             };             myContainer.Resources.Add("MyGradientBrush", brush);        }     } }

Краткие итоги

Стили – это очень важный инструмент при работе с XAML, Windows Presentation Foundation и Silverlight. В данной лабораторной работе мы рассмотрели несколько возможных способов их использования.

Литература

  1. Стили и шаблоны

http://msdn.microsoft.com/ru-ru/library/bb613570.aspx.

Лекция 4. Silverlight и WPF в Visual Studio 2010.

Краткая аннотация лекции: освещаются новые возможности Framework 4, WPF версии 4, а так же новые возможности Microsoft Visual Studio 2010 добавленные для поддержки реализованных нововведений.

Цель лекции: рассмотреть новые средства WPF версии 4. Показать какая поддержка появидась в Microsoft Visual Studio 2010 для удобства и эффективного программирования с применением технологии WPF.

Новые возможности WPF 4.

WPF история становления

WPF 4 — относительно новая технология. Частично она входила в несколько выпусков .NET и постепенно совершенствовалась.

WPF 3.0.

Первая версия WPF вышла вместе с двумя другими технологиями: Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF). Все вместе это называлось .NET 3.0.

WPF 3.5.

Год спустя, вышла новая версия WPF, как часть .NET Framework 3.5. Новые средства WPF в основном были слегка усовершенствованы, включая исправление ошибок и повышение производительности.

WPF 3.5 SP1.

Когда вышел пакет обновлений .NET Framework Service Pack 1 (SP1), проектировщики WPF получили возможность добавить некоторые новые средства, подобные сглаженной графике (благодаря построителям текстуры) и изощренному элементу управления DataGrid.

WPF 4.

В последнем выпуске WPF появилось множество улучшений, включая ценные новые средства, построенные на базе существующей инфраструктуры WPF. Среди некоторых наиболее заметных изменений — улучшенная визуализация текста, более естественная анимация и поддержка средств Windows 7, таких как сенсорные возможности и новая панель задач.

Visual Studio 2010 и WPF.

Вся "обстановка" в IDE реализована на WPF. Буквально все рамки и украшения документа, и служебные окна являются частью "визуального дерева" (Visual Tree) WPF. В него включены главное меню, панели инструментов, контекстные меню и панель статуса. Документ в целом - по сути, вся система управления окном - тоже WPF, включая оверлейные слои, которые появляются при перетаскивании окон. Обновленная стартовая страница (Start Page) так же полностью реализована на WPF и, при желании, Вы можете написать свою собственную замену стартовой странице на XAML. Новый редактор текста, который был создан с нуля с использованием WPF. Использование WPF в редакторе открывает для разработчиков возможности усовершенствования редактора путем создания впечатляющих расширения написанием всего нескольких строк кода. Несколько других часто используемых текстовых окон, такие, как "Вывод даннах" (Output) и "Cписок найденного" (Find Results List) также базируются на новом текстовом редакторе.

Небольшой, но важной функцией для Visual Studio является возможность создания основного окна WPF, не показывая его. Он используется в ситуациях, когда Visual Studio создается программно, например, в режиме "Design Time Extensibility" или при сборке приложения в режиме командной строки.

Для взаимодействия с меню и панелями инструментов с клавиатуры в Visual Studio использует новую функцию WPF "режим меню" (MenuMode). Она позволяет перенаправить сообщения в меню или панель инструментов без "кражи" фокуса ввода у активного в данный момент элемента. Без этой функции некоторые сценарии в Visual Studio было бы невозможно осуществить на практике с использованием WPF.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]