Репликация WPF TabControl выбрал поведение времени разработки TabItem для пользовательского элемента управления - PullRequest
1 голос
/ 24 июня 2011

Я разрабатываю пользовательский элемент управления, который отображает встроенное всплывающее окно, и я хотел бы использовать метод, аналогичный тому, который используется в TabControl, чтобы только всплывающие окна выбирались в конструкторе или, что более часто, помещали курсор внутри всплывающего окна. объявление в XAML, что оно визуализируется прямо в desiger без необходимости запуска приложения или изменения каких-либо значений времени выполнения вручную.

Я начал с дублирования реализации TabControl, который успешно имитирует все, но все это скопировано из выходных данных Reflector и Stylesnooper. Я переименовал все части элемента управления, а затем заменил шаблоны по умолчанию, чтобы основной элемент управления использовал ItemsPresenter вместо ContentPresenter для отображения отдельных всплывающих элементов управления на панели «Сетка», наложенных друг на друга. Пока это тоже работает отлично. Проблема в том, что где-то на линии я утратил способность заставлять дизайнера следовать элементу, выбранному в редакторе XAML.

Либо объяснение того, как функциональность поведения времени разработки TabControl на самом деле работает для описания выбранного поведения TabItem, которое я описал выше, или просто несколько указателей на то, как можно добиться того, что я пытаюсь сделать, было бы здорово.

1 Ответ

1 голос
/ 05 апреля 2012

Чтобы решить подобную проблему, мне пришлось создать поддержку времени разработки для моего пользовательского элемента управления вкладками.Вот ссылка на Расширение WPF Designer .

По сути, я создал PrimarySelectionAdornerProvider для обработки взаимодействия с кликами и пару FeatureConnector <> / FeatureProvider для изменений выбора (включая изменения выбора, сделанные в xamlредактор).

Поставщик функций / соединитель:

[FeatureConnector(typeof(AutoTabPageSelectionFeatureConnector))]
class AutoTabPageSelectionFeatureProvider : FeatureProvider
{
    public AutoTabPageSelectionFeatureProvider()
        : base()
    {
        // sole purpose is to register the connector
    }

}
class AutoTabPageSelectionFeatureConnector : FeatureConnector<AutoTabPageSelectionFeatureProvider>
{
    public AutoTabPageSelectionFeatureConnector(FeatureManager manager)
        : base(manager)
    {
        SelectionOperations.Subscribe(this.Context, SelectionChanged);
    }

    private void SelectionChanged(Selection selection)
    {
        if (selection.PrimarySelection != null)
        {
            // navigate tree to find parent (custom tab page and custom tab control)
            for (ModelItem item = selection.PrimarySelection; item != null; item = item.Parent)
            {
                // once found, select appropriate tab
            }
        }
    }
}

Редактировать (подробнее):

Эта ссылка Microsoft имеет несколько ссылокпроходы, которые должны помочь.Вот основные шаги для начала:

  1. Создайте новый проект, MyAssembly.VisualStudio.Design.dll.

  2. Библиотека должна скомпилироватьсяв то же местоположение, что и MyAssembly.dll (важно).

  3. Добавьте ссылки на Microsoft.Windows.Design.Extensibility и Microsoft.Windows.Design.Interaction.

  4. Добавьте ссылку на вашу управляющую библиотеку.

  5. Создайте класс с именем Метаданные

Код:

internal class Metadata : IProvideAttributeTable
{
    // Accessed by the designer to register any design-time metadata.
    public AttributeTable AttributeTable
    {
        get
        {
            AttributeTableBuilder builder = new AttributeTableBuilder();

            // Add the adorner provider to the design-time metadata.
            builder.AddCustomAttributes(
                typeof(MyControl), // rename to your control's name
                new FeatureAttribute(typeof(MyPrimaryAdornerProvider)), // rename to whatever you will call your PrimaryAdornerProvider
                new FeatureAttribute(typeof(AutoTabPageSelectionFeatureProvider)) // rename to whatever you will call your SelectionFeatureProvider
                );

            return builder.CreateTable();
        }
    }
}
  1. Создайте класс MyPrimaryAdornerProvider из PrimarySelectionAdornerProvider (переименуйте в любое, что вы хотите).См. Ссылку для ознакомления.

  2. Создайте AutoTabPageSelectionFeatureProvider и AutoTabPageSelectionFeatureConnector из приведенного выше примера.

...