Опубликован: 05.08.2010 | Уровень: специалист | Доступ: свободно
Самостоятельная работа 9:

Основы WPF

Страница 3. Использование линейной градиентной кисти LinearGradientBrush

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

Конструктор объекта линейной градиентной кисти имеет несколько перегрузок, в одних из которых задаются две точки и два цвета; два цвета, начальная точка привязки вектора градиента и угол его направления закраски. Точки могут задавать относительные (по умолчанию) и абсолютные координаты в рамках ограничивающего прямоугольника, что определяется свойством MappingMode и его значением из перечисления BrushMappingMode.

  • Создайте новую страницу Page3 в файле CreateBrushes.cs, демонстрирующую один из вариантов линейной градиентной закраски
namespace WpfApp1
{
    class Page3 : Page
    {
        public Page3()
        {
            this.WindowTitle = "Page3: Кисть LinearGradientBrush";
    
            Button btn = new Button();
            btn.Content="Next Page4";
            btn.Click += new RoutedEventHandler(btn3_Click);
            this.Content = btn;
    
            // Создание и присоединение градиента
            LinearGradientBrush brush = new LinearGradientBrush(
                Colors.Red, Colors.Blue, new Point(0, 0), new Point(1, 1));
            btn.Background = brush;
        }
    
        // Переход на следующую страницу
        void btn3_Click(object sender, RoutedEventArgs e)
        {
        }
    }
}
  • Вставьте в обработчик кнопки перехода на следующую страницу в классе Page2 код создания экземпляра Page3
// Переход на следующую страницу
        Page3 page3;
        void btnPage2_Click(object sender, RoutedEventArgs e)
        {
            if (!this.NavigationService.CanGoForward)
                page3 = new Page3();// Создаем только один раз 
            this.NavigationService.Navigate(page3);
        }
  • Запустите приложение и испытайте работу класса Page3 в составе навигационного каркаса


Страница 4. Периодическая смена направления градиента

Если отрезок меньше ограничивающего прямоугольника, то за крайними точками градиент цветности может сменить направление на противоположное и заливка продолжится с такой же интенсивностью, что и на определяющем отрезке. Такое поведение кисти LinearGradientBrush определяется наследуемым от GradientBrush свойством SpreatMethod и его значением из перечисления GradientSpreadMethod.

  • Создайте новую страницу Page4 в файле CreateBrushes.cs, демонстрирующую волнообразную градиентную закраску
namespace WpfApp1
{
    class Page4 : Page
    {
        public Page4()
        {
            this.WindowTitle = "Page4: GradientSpreadMethod.Reflect";
    
            Button btn = new Button();
            btn.Content = "Next Page5";
            btn.Click += new RoutedEventHandler(btn4_Click);
            this.Content = btn;
    
            // Создание и присоединение градиента
            LinearGradientBrush brush = new LinearGradientBrush(
                Colors.Red, Colors.Blue, new Point(0, 0), new Point(0.25, 0.25));
            brush.SpreadMethod = GradientSpreadMethod.Reflect;
    
            btn.Background = brush;
        }
    
        // Переход на следующую страницу
        void btn4_Click(object sender, RoutedEventArgs e)
        {
        }
    }
}
  • Вставьте в обработчик кнопки перехода на следующую страницу в классе Page3 код создания экземпляра Page4
// Переход на следующую страницу
        Page4 page4;
        void btn3_Click(object sender, RoutedEventArgs e)
        {
            if (!this.NavigationService.CanGoForward)
                page4 = new Page4();// Создаем только один раз 
            this.NavigationService.Navigate(page4);
        }
  • Запустите приложение и испытайте работу класса Page4 с периодической сменой направления линейного градиента


Страница 5. Ступенчатая закраска градиентами

У линейного градиента есть коллекция GradientStops, содержащая объекты GradientStop. Каждый из объектов коллекции задает начальный цвет градиента и правую границу полного перекрытия этим цветом предыдущего. В такой модели дополнительно используются точки границ закраски, определяемые свойствами StartPoint и EndPoint. Для иллюстрации создадим страницу, поместим на нее кнопку и закрасим кнопку вертикальными градиентами.

  • Создайте новую страницу Page5 в файле CreateBrushes.cs, поместите на нее кнопку и закрасьте вертикальными градиентами с помощью следующего кода
namespace WpfApp1
{
    class Page5 : Page
    {
        public Page5()
        {
            this.WindowTitle = "Page5: Закраска цветами радуги";
    
            Button btn = new Button();
            this.Content = btn;
            btn.Content = "Next Page6";
            btn.Click += new RoutedEventHandler(btn5_Click);
    
            // Создание и присоединение градиента
            LinearGradientBrush brush = new LinearGradientBrush();
            btn.Background = brush;
    
            brush.StartPoint = new Point(0, 0);
            brush.EndPoint = new Point(1, 0);
    
            // Цвета радуги
            brush.GradientStops.Add(new GradientStop(Colors.Red, 0));
            brush.GradientStops.Add(new GradientStop(Colors.Orange, .17));
            brush.GradientStops.Add(new GradientStop(Colors.Yellow, .33));
            brush.GradientStops.Add(new GradientStop(Colors.Green, .5));
            brush.GradientStops.Add(new GradientStop(Colors.CornflowerBlue, .67));
            brush.GradientStops.Add(new GradientStop(Colors.Blue, .84));
            brush.GradientStops.Add(new GradientStop(Colors.BlueViolet, 1));
        }
    
        // Переход на следующую страницу
        void btn5_Click(object sender, RoutedEventArgs e)
        {
        }
    }
}
  • Вставьте в обработчик кнопки перехода на следующую страницу в классе Page4 код создания экземпляра Page5
// Переход на следующую страницу
        Page5 page5;
        void btn4_Click(object sender, RoutedEventArgs e)
        {
            if (!this.NavigationService.CanGoForward)
                page5 = new Page5();// Создаем только один раз 
            this.NavigationService.Navigate(page5);
        }
  • Запустите приложение и испытайте работу класса Page5, рисующего последовательные переливы цветов радуги


Страница 6. Закраска радиальным градиентом RadialGradientBrush

Радиальный градиент реализуется классом RadialGradientBrush. Следующий пример демонстрирует работу этого градиента

  • Создайте новую страницу Page6 в файле CreateBrushes.cs и закрасьте ее с помощью следующего кода
namespace WpfApp1
{
    class Page6 : Page
    {
        public Page6()
        {
            this.WindowTitle = "Page6: Радиальный градиент";
    
            // Создание и присоединение градиента
            RadialGradientBrush brush = new RadialGradientBrush();
            this.Background = brush;
    
            // Цвета радуги
            brush.GradientStops.Add(new GradientStop(Colors.Red, 0));
            brush.GradientStops.Add(new GradientStop(Colors.Orange, .17));
            brush.GradientStops.Add(new GradientStop(Colors.Yellow, .33));
            brush.GradientStops.Add(new GradientStop(Colors.Green, .5));
            brush.GradientStops.Add(new GradientStop(Colors.CornflowerBlue, .67));
            brush.GradientStops.Add(new GradientStop(Colors.Blue, .84));
            brush.GradientStops.Add(new GradientStop(Colors.BlueViolet, 1));
        }
    }
}
  • Вставьте в обработчик кнопки перехода на следующую страницу в классе Page5 код создания экземпляра Page6
// Переход на следующую страницу
        Page6 page6;
        void btn5_Click(object sender, RoutedEventArgs e)
        {
            if (!this.NavigationService.CanGoForward)
                page6 = new Page6();// Создаем только один раз 
            this.NavigationService.Navigate(page6);
        }
  • Запустите приложение и испытайте работу кисти с радиальным градиентом


Алексей Бабушкин
Алексей Бабушкин

При выполнении в лабораторной работе упражнения №1 , а именно при выполнении нижеследующего кода:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using Microsoft.Xna.Framework.Graphics;

   

namespace Application1

{

    public partial class MainForm : Form

    {

        // Объявим поле графического устройства для видимости в методах

        GraphicsDevice device;

   

        public MainForm()

        {

            InitializeComponent();

   

            // Подпишемся на событие Load формы

            this.Load += new EventHandler(MainForm_Load);

   

            // Попишемся на событие FormClosed формы

            this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed);

        }

   

        void MainForm_FormClosed(object sender, FormClosedEventArgs e)

        {

            //  Удаляем (освобождаем) устройство

            device.Dispose();

            // На всякий случай присваиваем ссылке на устройство значение null

            device = null;       

        }

   

        void MainForm_Load(object sender, EventArgs e)

        {

            // Создаем объект представления для настройки графического устройства

            PresentationParameters presentParams = new PresentationParameters();

            // Настраиваем объект представления через его свойства

            presentParams.IsFullScreen = false; // Включаем оконный режим

            presentParams.BackBufferCount = 1;  // Включаем задний буфер

                                                // для двойной буферизации

            // Переключение переднего и заднего буферов

            // должно осуществляться с максимальной эффективностью

            presentParams.SwapEffect = SwapEffect.Discard;

            // Устанавливаем размеры заднего буфера по клиентской области окна формы

            presentParams.BackBufferWidth = this.ClientSize.Width;

            presentParams.BackBufferHeight = this.ClientSize.Height;

   

            // Создадим графическое устройство с заданными настройками

            device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware,

                this.Handle, presentParams);

        }

   

        protected override void OnPaint(PaintEventArgs e)

        {

            device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);

   

            base.OnPaint(e);

        }

    }

}

Выбрасывается исключение:

Невозможно загрузить файл или сборку "Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" или один из зависимых от них компонентов. Не удается найти указанный файл.

Делаю все пунктуально. В чем может быть проблема?

Юрий Макушин
Юрий Макушин
Россия, Москва, РЭА им. Плеханова, 2004