Поделиться через


Пошаговое руководство. Изменение поведения свойства во время разработки

Обновлен: Ноябрь 2007

При использовании расширяемости среды для настройки Windows Presentation Foundation (WPF) для Visual Studio (конструктор) часто создаются пользовательские элементы управления. Иногда требуется, чтобы свойство элемента управления вело себя по-разному во время разработки и во время выполнения, несмотря на то что пользователю позволено устанавливать значение свойства обычным образом. Например, требуется, чтобы пользователь имел возможность установить значение false для свойства «Visible», но элемент управления по-прежнему должен быть видимым во время разработки.

В этом примере создаются пользовательские элементы управления Button и изменяется поведение свойств Background и Content. Для этого создается поставщик DesignModeValueProvider, который присоединяется к пользовательскому элементу управления. Поставщик DesignModeValueProvider фиксирует изменения свойства, которые совершает пользователь, в метод TranslatePropertyValue вставляется собственная логика, после чего поставщик DesignModeValueProvider передает в конструктор новые значения.

Bb514694.alert_caution(ru-ru,VS.90).gifВажное примечание.

При использовании этого способа поведение свойства в конструкторе не соответствует значению свойства в представлении XAML. Представление XAML отображает значение, введенное пользователем во время разработки. Значение в представлении XAML представляет поведение, которое свойство будет проявлять во время выполнения.

В данном пошаговом руководстве выполняются следующие задачи.

  • Создание проекта библиотеки пользовательских элементов управления WPF.

  • Создание пользовательского поставщика DesignModeValueProvider.

  • Создание пользовательского элемента управления «кнопка».

  • Присоединение поставщика DesignModeValueProvider к пользовательскому элементу управления.

  • Создание тестового приложения.

  • Тестирование пользовательского элемента управления.

Bb514694.alert_note(ru-ru,VS.90).gifПримечание.

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или версии среды. Для изменения параметров выберите пункт Импорт и экспорт параметров в меню Сервис. Дополнительные сведения см. в разделе Параметры Visual Studio.

Обязательные компоненты

Ниже приведены компоненты, которые необходимы для выполнения данного пошагового руководства.

  • Visual Studio 2008

Создание проекта библиотеки пользовательских элементов управления WPF

Создание проекта

  1. Создайте новый проект библиотеки пользовательских элементов управления WPF на языке Visual Basic или Visual C# с именем CustomButton.

    В редакторе кода откроется код для элемента управления CustomControl1.

  2. Добавьте ссылку на следующую сборку:

    • Microsoft.Windows.Design.Extensibility
  3. В обозревателе решений измените имя файла с кодом на CustomButton.cs или CustomButton.vb.

    При появлении окна сообщения, запрашивающего подтверждение переименования всех ссылок в этом проекте, нажмите кнопку Да.

  4. В обозревателе решений разверните папку Themes и откройте файл Generic.xaml.

    Файл Generic.xaml откроется в WPF (конструктор).

  5. В представлении XAML в файле Generic.xaml замените все вхождения «CustomControl1» на «CustomButton».

  6. В меню Построение выберите Построить решение.

Создание пользовательского класса «DesignModeValueProvider»

В этой процедуре создается пользовательский поставщик DesignModeValueProvider. В методе TranslatePropertyValue измените свойство Content элемента управления Button таким образом, чтобы содержимое этой кнопки отображалось в конструкторе строчными буквами. Также измените свойство Background элемента управления Button таким образом, чтобы в конструкторе кнопка отображалась со стандартным системным цветом. Эти изменения затрагивают только конструктор. Во время выполнения свойства Content и Background отображаются со значениями, заданными пользователем.

Bb514694.alert_note(ru-ru,VS.90).gifПримечание.

В этой процедуре создается один объект DesignModeValueProvider, который обрабатывает два различных свойства. Также для обработки различных свойств можно создать несколько объектов DesignModeValueProvider.

Создание пользовательского класса «DesignModeValueProvider»

  1. Добавьте новый класс с именем CustomButtonDesignModeValueProvider.cs или CustomButtonDesignModeValueProvider.vb в проект «CustomButton».

    Новый класс открывается в редакторе кода.

  2. Добавьте следующие пространства имен в верхней части файла. Замените существующие пространства, если они присутствуют.

    Imports System
    Imports System.Windows                  'SystemColors
    Imports System.Windows.Media            'SolidColorBrush
    Imports System.Windows.Controls         'Button
    Imports Microsoft.Windows.Design.Model  'DesignModeValueProvider
    
    using System;
    using System.Windows;                   //SystemColors
    using System.Windows.Media;             //SolidColorBrush
    using System.Windows.Controls;          //Button
    using Microsoft.Windows.Design.Model;   //DesignModeValueProvider
    
  3. Измените класс CustomButtonDesignModeValueProvider, чтобы он был производным от класса DesignModeValueProvider.

    Public Class CustomButtonDesignModeValueProvider
        Inherits DesignModeValueProvider
    
    End Class
    
    class CustomButtonDesignModeValueProvider : DesignModeValueProvider
    {
    }
    
  4. Добавьте в класс конструктор. В конструкторе можно определить свойства, которые требуется фиксировать.

    Public Sub New()
    
        Properties.Add(Button.ContentProperty)
        Properties.Add(Button.BackgroundProperty)
    End Sub
    
    public CustomButtonDesignModeValueProvider()
    {
        Properties.Add(Button.ContentProperty);
        Properties.Add(Button.BackgroundProperty);
    }
    
  5. Переопределите метод TranslatePropertyValue в классе. Здесь указывается новое поведение свойств во время разработки.

    Public Overrides Function TranslatePropertyValue(ByVal identifier As PropertyIdentifier, ByVal value As Object) As Object
    
        If identifier.DependencyProperty Is Button.ContentProperty Then
    
            Return value.ToString().ToUpper()
        End If
    
        If identifier.DependencyProperty Is Button.BackgroundProperty Then
    
            Return New SolidColorBrush(SystemColors.ControlColor)
        End If
    
        Return MyBase.TranslatePropertyValue(identifier, value)
    End Function
    
    public override object TranslatePropertyValue(PropertyIdentifier identifier, object value)
    {
        if (identifier.DependencyProperty == Button.ContentProperty)
        {
            return ((string)value).ToUpper();
        }
    
        if (identifier.DependencyProperty == Button.BackgroundProperty)
        {
            return new SolidColorBrush(SystemColors.ControlColor);
        }
    
        return base.TranslatePropertyValue(identifier, value);
    }
    
  6. В меню Построение выберите Собрать решение.

Создание пользовательского элемента управления «кнопка»

В этой процедуре создается пользовательский элемент управления. Создается простой пользовательский элемент управления, который является производным от класса Button, но не содержит дополнительные пользовательские функциональные возможности.

Создание пользовательского элемента управления «кнопка»

  1. Откройте класс CustomButton в редакторе кода.

  2. Добавьте следующие пространства имен в верхней части файла. Замените существующие пространства, если они присутствуют.

    Imports System.Windows.Controls             'Button
    Imports Microsoft.Windows.Design.Features   'Feature
    
    using System.Windows.Controls;              //Button
    using Microsoft.Windows.Design.Features;    //Feature
    
  3. Замените существующий класс следующим.

    Public Class CustomButton
        Inherits Button
    
        Shared Sub New()
    
        End Sub
    End Class
    
    public class CustomButton : Button
    {
        static CustomButton()
        {
        }
    }
    
  4. В меню Построение выберите Построить решение.

Присоединение класса «DesignModeValueProvider» к пользовательскому элементу управления

В этой процедуре класс DesignModeValueProvider присоединяется к пользовательскому элементу управления с помощью атрибута FeatureAttribute.

Bb514694.alert_note(ru-ru,VS.90).gifПримечание.

Можно также присоединить класс DesignModeValueProvider к пользовательскому элементу управления с помощью хранилища метаданных. Дополнительные сведения см. в разделах Хранилище метаданных и Практическое руководство. Использование хранилища метаданных.

Присоединение класса «DesignModeValueProvider» к пользовательскому элементу управления

  1. В редакторе кода найдите объявление класса CustomButton. Код должен выглядеть следующим образом:

    Public Class CustomButton
        Inherits Button
    
    public class CustomButton : Button
    
  2. Добавьте атрибут «Feature» к объявлению класса и задайте класс DesignModeValueProvider.

    <Feature(GetType(CustomButtonDesignModeValueProvider))> _
    Public Class CustomButton
        Inherits Button
    
    [Feature(typeof(CustomButtonDesignModeValueProvider))]
    public class CustomButton : Button
    
  3. В меню ПостроениевыберитеПостроить решение.

Создание тестового приложения

Создание тестового приложения

  1. Добавьте к решению новый проект приложения WPF CustomButtonTestApplication.

    Файл Window1.xaml откроется в WPF (конструктор).

  2. В обозревателе решений щелкните правой кнопкой мыши проект и выберите Назначить запускаемым проектом.

  3. В меню Проект нажмите Добавить ссылку и воспользуйтесь вкладкой Проекты для добавления ссылки на проект «CustomButton».

  4. В меню Построение выберите Построить решение.

Тестирование пользовательского элемента управления

Тестирование пользовательского элемента управления

  1. В представлении XAML для файла Window1.xaml замените существующий код на следующий:

    <Window x:Class="CustomButtonTestApplication.Window1"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:cb="clr-namespace:CustomButton;assembly=CustomButton"
        Title="Window1" Height="300" Width="300">
        <Grid>
            <cb:CustomButton Height="75" Width="100">Button1</cb:CustomButton>
        </Grid>
    </Window>
    
  2. В представлении конструктора выберите кнопку. При необходимости щелкните панель информации в верхней части конструктора, чтобы перегрузить представление.

  3. В окне Свойства найдите свойство Background.

  4. Введите Red и нажмите клавишу ВВОД.

    Представление XAML появляется новый код Background="Red", но цвет кнопки в представлении конструктора не изменяется.

  5. В окне Свойства найдите свойство Content.

  6. Введите Hello World и нажмите клавишу ВВОД.

    В представлении XAML появляется новое содержимое Hello World, но в представлении конструктора кнопка отображает текст HELLO WORLD.

  7. В меню Отладка выберите команду Начать отладку.

    Запускается приложение и открывается окно. Во время выполнения цвет кнопки становится красным и содержит текст Hello World.

  8. Закройте окно.

См. также

Задачи

Практическое руководство. Изменение поведения свойства во время разработки

Практическое руководство. Определение режима, в котором находится пользовательский элемент управления (режим разработки или режиме выполнения)

Другие ресурсы

Сравнение поведения во время разработки и во время выполнения

Общее представление о расширяемости конструктора WPF

Расширяемость среды конструктора WPF