Окно Properties в Visual Studio

158

Одно из наиболее часто используемых инструментальных окон в системе Visual Studio 2013 - окно Properties (F4), показанное на рисунке ниже. Окно Properties состоит из сетки свойств и является контекстно-зависимым, отображая только релевантные свойства выделенного элемента, независимо от того, является ли этот элемент узлом в окне Solution Explorer или элементом формы. Каждая строка отображает свойство, имеющее имя и соответствующее значение, записанные в двух столбцах. На рисунке ниже показана обновленная сетка свойств для приложений WPF, содержащая пиктограмму предварительного просмотра и возможности поиска.

Окно Properties в Visual Studio

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

Для веб- и WPF-приложений набор свойств в окне Properties сохраняется в виде файлов разметки с расширением *.aspx или *.xaml соответственно. Как и в проектировщике форм Windows, в окне Properties отображаются только те свойства, которые постоянно хранятся в файле разметки.

Окно Properties предлагает средства для подключения обработчиков событий в виде кнопки со значком молнии в правом верхнем углу.

Расширение окна Properties

В проектах Window Forms система Visual Studio 2013 выделяет свойства, подлежащие изменению, полужирным шрифтом. У вас должен был возникнуть вопрос: откуда система Visual Studio 2013 знает, каким должно быть значение по умолчанию? Ответ заключается в том, что когда окно Properties просматривает объект, чтобы определить, какие свойства должны отражаться в сетке свойств, она перебирает большое количество атрибутов проекта. Эти атрибуты можно использовать для управления отображением свойств, выбора редактора, который должен использоваться для изменения значений, а также для выбора значения, заданного по умолчанию.

Для того чтобы показать, как можно использовать эти атрибуты для создания своих собственных компонентов, начнем с добавления простого элемента управления WPF, унаследованного от Button и имеющего одно автоматическое свойство:

using System.Windows.Controls;
using System.ComponentModel;

namespace GettingStarted
{
    public class SampleButton : Button
    {
        public string Description { get; set; }
    }
}

Давайте добавим этот элемент в окно MainWindow.xaml:

<Window x:Class="GettingStarted.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        xmlns:local="clr-namespace:GettingStarted">
    <Grid>
        <TextBox x:Name="txtSayHello" HorizontalAlignment="Left" Height="23" 
				 TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120" Margin="47,44,0,0"/>
        <local:SampleButton x:Name="btnSayHello" Content="Сказать привет!" 
				 HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" Margin="47,99,0,0" 
				 Click="btnSayHello_Click"/>

    </Grid>
</Window>

На рисунке ниже показано новое свойство Description в окне Properties. Чтобы быстрее его найти среди других свойств, я воспользовался поиском:

Добавление свойства в окно Properties

Атрибут Browsable

По умолчанию в сетке свойств отображаются все открытые свойства. Однако вы можете явно управлять его поведением, добавив атрибут Browsable (из пространства имен System.ComponentModel). Если вы установите это свойство равным false, то оно не будет показано в сетке свойств.

[Browsable(false)]
public string Description { get; set; }

Атрибут DisplayName

Атрибут DisplayName вполне очевиден: он позволяет изменять имя свойства. В данном случае мы можем изменить имя свойства, которое появится в сетке свойств с Description на "Описание элемента управления":

[DisplayName("Описание элемента управления")]
public string Description { get; set; }
Изменение имени свойства в окне Properties

Атрибут Description

Кроме возможности задавать имя свойства по своему усмотрению, целесообразно также предоставлять описание, которое должно появляться в нижней части окна Properties, когда выбирается соответствующее свойство. Это гарантирует, что пользователи компонента знают его свойства.

[DisplayName("Описание элемента управления")]
[Description("Мое первое свойство")]
public string Description { get; set; }

Атрибут Category

По умолчанию любое видимое свойство размещается в группе Miscellaneous, если окно Properties имеет сгруппированное представление. Используя атрибут Category, вы сможете разместить ваше свойство в любой из существующих групп, таких как Appearance или Data, или в новой группе, если укажете имя группы, которой еще нет.

[Category("Text")]
public string Description { get; set; }

Атрибут DefaultValue

Система Visual Studio 2013 выделяет свойства, которые были изменены по сравнению со своим начальным значением или значением, заданным по умолчанию. Атрибут DefaultValue определяет, как система Visual Studio 2013 выполняет поиск значений, заданных по умолчанию для указанного свойства.

[DefaultValue("<добавить описание>")]
public string Description { get; set; }

В данном случае, если значение свойства Description установлено равным "<добавить описание>", система Visual Studio 2013 удаляет строку кода, которая устанавливает это свойство. Если вы изменили это свойство и хотите вернуть его первоначальное значение, щелкните правой кнопкой мыши в окне Properties и выполните команду Reset в контекстном меню.

Следует подчеркнуть, что атрибут DefaultValue не устанавливает начальное значение вашего свойства. Если вы задаете атрибут DefaultValue, то рекомендуется одновременно установить начальное значение точно так же, как и в предшествующем коде.

Атрибут AmbientValue

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

Как и атрибут DefaultValue, атрибут AmbientValue используется для того, чтобы служить индикатором для системы Visual Studio 2013, когда она не должна добавлять код в файл проектировщика. К сожалению, при работе со свойствами зависимости невозможно жестко задать в коде значение, с которым следует сравнивать текущее значение, поскольку оно зависит от значения, заданного в источнике свойств. Из-за этого, когда вы определяете атрибут AmbientValue, вы поручаете проектировщику искать функцию ShouldSerializePropertyName. В данном случае эта функция называется ShouldSerializeDescription, и этот метод вызывается для того, чтобы определить, следует ли хранить текущее значение свойства в исходном файле проектировщика.

using System.Windows.Controls;
using System.ComponentModel;

namespace GettingStarted
{
    public class SampleButton : Button
    {
        const string defValue = "<добавить описание>";
        string defaultDesc = defValue;
        
        [AmbientValue(defValue)]
        public string Description 
        { 
            get
            {
                if (this.defaultDesc == defValue && this.Parent is TextBlock)
                    return (Parent as TextBlock).Text;

                return defaultDesc;
            }

            set
            {
                defaultDesc = value;
            }
        }
    }
}

Когда вы создаете элемент управления с данным свойством, начальное значение должно быть установлено равным константе DefaultDescription, но в проектировщике вы можете увидеть значение, соответствующее значению Parent.Text.

В этой и предыдущих статьях вы увидели в действии три основных инструментальных окна - Solution Explorer, Toolbox и Properties. Зная правила манипулирования этими окнами, вы сэкономите много времени на этапе разработки. Однако истинная мощь системы Visual Studio 2013 проявляется, когда вы начинаете инкорпорировать свой опыт разработчика в собственные компоненты. Это может оказаться полезным, даже если ваши компоненты будут использоваться только в вашей организации. Эффективно используя проектировщик, можно улучшить не только процесс проектирования с помощью собственных элементов управления, но и повысить производительность создаваемого приложения.

Пройди тесты
Лучший чат для C# программистов