Как создать подкласс WPF ComboBox, чтобы добавить дополнительную кнопку - PullRequest
3 голосов
/ 18 августа 2010

Я видел похожий вопрос и надеялся на решение, но просто дать совет подклассу ComboBox недостаточно для меня. Мне это нужно в маленьких ложках ...

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

Я не ушел далеко ... Пожалуйста, помогите мне ...:)

Пока мой код:

public class ComboBoxWithAdd : ComboBox
{
    static ComboBoxWithAdd()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(ComboBoxWithAdd), new FrameworkPropertyMetadata(typeof(ComboBoxWithAdd)));
    }
}

В Generic.xaml у меня есть это:

<Style TargetType="{x:Type local:ComboBoxWithAdd}" BasedOn="{StaticResource {x:Type ComboBox}}">        
</Style>

Ответы [ 3 ]

4 голосов
/ 18 августа 2010

Принимая решение о создании пользовательского элемента управления, вам необходимо определить, нужно ли вам добавить фактическое поведение или просто пользовательский интерфейс. Просто добавить кнопку можно, просто настроив шаблон ControlTemplate. Похоже, вам нужна кнопка, которая вызывает действие, которое обновит элементы ComboBox, которые будут указывать направление, в котором вы начали извлекать элемент управления из ComboBox. Вам нужно будет добавить несколько вещей в код и сторону XAML. В вашем стиле вам нужно добавить Setter для ControlTemplate и начать с копии шаблона по умолчанию для ComboBox (я обычно делаю это с Blend, но есть и другие источники). Затем вы можете добавить новую кнопку в шаблоне в любом месте.

<Style TargetType="{x:Type local:ComboBoxWithAdd}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:ComboBoxWithAdd}">
                ... copy of default template with your modifications
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

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

public ComboBoxWithAdd()
{
    CommandBindings.Add(new CommandBinding(ApplicationCommands.New, NewExecutedMethod));
}

Затем в NewExecutedMethod просто добавьте любую логику, которую вы хотите выполнить для фактического действия по добавлению элемента (возможно, работая с ComboBox's Items / ItemsSource). Для подключения кнопки просто установите Command="ApplicationCommands.New". С помощью пользовательского элемента управления можно сделать гораздо больше, но это поможет вам начать работу.

1 голос
/ 04 апреля 2011

Rozon, Вы можете манипулировать Combobox из кода ниже, не создавая сложный шаблон:

public class CustomComboBox : ComboBox
{
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        Grid grid = WpfHelper.FindAllChildrenByName<Grid>(this, "MainGrid").SingleOrDefault() as Grid;
        if (grid != null)
        {
            grid.ColumnDefinitions.Add(new ColumnDefinition());
            Button button = new Button();
            button.Content = "test";
            button.SetValue(Grid.ColumnProperty, 2);
            grid.Children.Add(button);
        }
    } 
}

WpfHelper - это просто класс, который находит визуального потомка по имени. Обратите внимание, что это может легко сломаться, если изменить стандартный шаблон элемента управления комбинированного списка и переименовать MainGrid.

0 голосов
/ 18 августа 2010

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

Настраиваемый элемент управления не рекомендуется.

Но, если у вас есть такое требование.Здесь мы идем: 1) Вы должны получить контроль над тем, что вы пытаетесь расширить возможности.2) Вам необходимо создать шаблон по умолчанию для элемента управления.[Generic.Xaml]

Отдых - это ваша настройка.Но, одним из преимуществ является то, что вы можете получить легко контролируемый Skinnable элемент управления.

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...