Использование Custom PropertyTab в элементе управления System.Windows.Forms.PropertyGrid - PullRequest
2 голосов
/ 28 сентября 2011

Я пытаюсь использовать настраиваемую функцию вкладки свойств элемента управления WinForms PropertyGrid, но она меня превзошла.Я специально пытаюсь использовать PropertyGrid во время выполнения для отображения свойств объекта, а не пытаться создать поддержку элемента управления во время разработки, хотя они, похоже, являются приложениями схожей технологии.

Этот вопрос вызывает у меня серьезную обеспокоенностьсмущенный.Я попытался следовать нескольким учебникам по этой теме, и ни один из них не пришел к какому-либо действительно твердому выводу.

Обзор литературы

http://msdn.microsoft.com/en-us/library/aa302334.aspx#vsnetpropbrow_topic05

Эта статьяинформирует читателя, что добавить вкладки свойств легко выполнимо и что пример кода находится во включенном проекте FunkyButton, который нигде не включен.

http://www.codeproject.com/KB/grid/PropertyGridExWinForms.aspx

Этот проект предлагает толькоспособ использования пользовательских вкладок свойств состоит в расширении функциональности сетки базовых свойств путем переопределения, например, частного метода GetService ().Я совершенно уверен, что это не требуется, и попытался использовать его информацию для создания поставщика услуг.Тем не менее, это убедило меня, что класс SelectedObject в сетке свойств требует, чтобы атрибут класса PropertyTabAttribute был назначен расширенному System.Windows.Forms.PropertyGridInternal.PropertiesTab, который я создал и использовал.

http://www.dacris.com/blog/2008/01/02/net-how-to-show-events-tab-in-a-property-grid/

В этой статье указывается, что сама сетка свойств требует добавления вкладки с помощью метода PropertyGrid.PropertyTabs.AddTabType ().Затем выясняется, что свойство Site в сетке свойств необходимо назначить, а затем самодовольно предлагает, чтобы я уже знал, как это сделать: «... вам нужно установить свойство Site в сетке для какого-либо дизайнерского сайта, который выЕсли у вас есть собственные дизайнеры, вы должны знать, как их получить. "

http://www.syncfusion.com/FAQ/windowsforms/faq_c83c.aspx#q913q

Начав писать этот вопрос, я нашел ссылку на эту короткую статью натема с включенным кодом.Этот проект в большей степени ориентирован на функциональность во время разработки, однако, когда я использовал экземпляр их объекта в совершенно необычной PropertyGrid, он обнаружил кнопку вкладки «Свойства» и их объект «Пользовательская вкладка».Я был в состоянии переключаться между связанными взглядами без особых усилий.Однако проект, кажется, предлагает теперь настраиваемые атрибуты, чтобы различать свойства между доступными представлениями.В этой статье предлагается, чтобы я игнорировал определения сайтов, специализированных PropertyGrids и поставщиков услуг и сосредоточился на самом отображаемом объекте.

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

Заключение

Я в полной растерянности.Я должен быть близко, но из всех путей, которые я пытался сделать этой работой, возможно, мой мозг просто зажжен.Что является ключом к тому, чтобы заставить работать вкладки свойств?Это:

  • Определенное определение класса PropertyGrid.SelectedObject?
  • Настройки самой сетки свойств?
  • Все об определении пользовательской вкладки?

Работал ли последний описанный проект только потому, что SelectedObject унаследован от UserControl?Должен ли SelectedObject наследоваться от System.ComponentModel.Component?

Если кто-то может попытаться прояснить все это и предоставить максимально краткое описание того, как заставить его работать, я был бы очень признателен.

Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

Вот код вкладки настраиваемого свойства:

public class CustomTab : PropertyTab
{
    private Bitmap _bitmap;

    // the tooltip displayed in the grid
    public override string TabName
    {
        get
        {
            return "CustomTab";
        }
    }

    // the icon displayed in the grid
    public override Bitmap Bitmap
    {
        get
        {
            if (_bitmap == null)
            {
                // 1. create a file named "CustomTab.bmp". It must be a 16x16, 8-bit bitmap. Transparency pixel is magenta.
                // 2. place it in the project aside this .cs
                // 3. configure its build action to "Embedded Resource"
                _bitmap = new Bitmap(GetType(), GetType().Name + ".bmp");
            }
            return _bitmap;
        }
    }

    // TODO: return the descriptor corresponding to the properties you want to show
    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object component, Attribute[] attributes)
    {
        return new PropertyDescriptorCollection(null);
    }

    public override PropertyDescriptorCollection GetProperties(object component, Attribute[] attributes)
    {
        return GetProperties(null, component, attributes);
    }
}

А вот как вы можете добавить его в сетку свойств:

CustomTab tab = new CustomTab();
grid.PropertyTabs.AddTabType(typeof(CustomTab), PropertyTabScope.Global);

Он ничего не отобразит, потому что яне возвращайте PropertyDescriptor в перегрузке GetProperties, но здесь вам нужно определить, какой дескриптор вы хотите использовать.

OP Edit:

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

  • Отображаемый объект не должен наследовать ничего, как Control или Component

  • Свойство PropertyGrid.Site не нужно устанавливать

  • Сетка свойств не нужно расширять пользовательским классом

  • Сетка свойств даже не требует явного добавления вкладки, если она вызывается в SelectedObject атрибутом.Конечно, необходимо добавить постоянную вкладку.

  • Убедитесь, что все три метода PropertiesTab.GetProperties переопределены и указывают на требуемый метод, а не на базовый метод.

  • Переопределение растрового изображения на вкладке должно что-то делать!

0 голосов
/ 11 июня 2016

Я думаю, что примера кода из MSDN вполне достаточно:

На Form поместите PropertyGrid.Когда вы компилируете пример кода, в VS Toolbox появляется компонент.Поместите его в форму и в окне Свойства установите для него свойство PropertyGrid.SelectedObject.

Кстати, фактическая настройка происходит в PropertyTab::GetProperties.

0 голосов
/ 20 октября 2013

Образцы кода доступны сейчас на странице MSDN , которую вы указали в своем описании. Ссылка для скачивания находится между «Сводка» и «Содержание»; поиск «Codesamples.exe», вероятно, быстро доставит вас туда.

...