Как захватить событие, когда элемент в списке WPF щелкает или выбирается клавишей Enter? - PullRequest
6 голосов
/ 14 апреля 2011

Я пробовал это несколько часов, но это не работает.

У меня есть выпадающий список с несколькими элементами, сгенерированный динамически, как окно поиска.

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

Как этого добиться? Я попытался установить обработчик событий мыши / клавиатуры в Combobox, но он работает только в текстовом поле, а не в выпадающем списке.

Спасибо.

Edit: Я забыл упомянуть, что у меня есть собственный DataTemplate на моем Combobox. Я попробовал другой подход, который устанавливает событие в ComboBox.ItemContainerStyle.

Я попытался PreviewKeyDown, но он не захвачен. Есть идеи?

Ответы [ 5 ]

8 голосов
/ 14 апреля 2011

вместо использования события MouseLeftButtonDown, используйте событие PreviewMouseLeftButtonDown

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

5 голосов
/ 14 апреля 2011

Я думаю, что вы ищете это событие "SelectionChanged".Это событие возникает, как только вы выбираете элемент в раскрывающемся списке, либо щелчком мыши, либо с помощью клавиш со стрелками и нажимаете «Enter» (я пробовал оба варианта с успехом).

       <ComboBox x:Name="cbobox" ItemsSource="{Binding SourceList}" 
              SelectionChanged="cbobox_SelectionChanged">
        <ComboBox.ItemContainerStyle>
            <Style TargetType="{x:Type ComboBoxItem}">
                <Setter Property="Template" >
                    <Setter.Value>
                        <ControlTemplate>
                            <TextBlock Text="{Binding BusinessProperty}"/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ComboBox.ItemContainerStyle>
    </ComboBox>
2 голосов
/ 17 августа 2011

Я тоже пробовал это часами, и вот мое решение: Подпишитесь на событие KeyUp.

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

public override void OnApplyTemplate()
{
        base.OnApplyTemplate();
        KeyUp += OnKeyUp;
}

void OnKeyUp(object sender, KeyEventArgs e)
{
        if (e.Key == Key.Down)
        {...}
        else if (e.Key == Key.Up)
        {...}
        else if(e.Key == Key.Enter)
        {...}
}

Надеюсь, это сработает и у вас.

0 голосов
/ 06 марта 2017

Через неделю я получаю это

 <StackPanel>
            <ComboBox Name="cmb" ItemsSource="{Binding Items}"   
                          SelectedValue="{Binding SelectedVale}">
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Button Content="{Binding DisplayText}" Command="{Binding ItemClick}" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"></Button>
                        </StackPanel>
                    </DataTemplate>

                </ComboBox.ItemTemplate>
            </ComboBox>
        </StackPanel>
0 голосов
/ 13 июля 2011

Если вы используете пользовательский ControlTemplate для ComboBoxItem, это может быть проблемой с HorizontalContentAlignment ContentPresenter. Вот как выглядел мой старый ControlTemplate, когда у меня возникла проблема:

<ControlTemplate TargetType="{x:Type ComboBoxItem}">
    ....
    <ContentPresenter 
        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>

А вот как это выглядело после того, как я исправил проблему:

<ControlTemplate TargetType="{x:Type ComboBoxItem}">
    ....
    <ContentPresenter 
        HorizontalAlignment="Stretch" 
        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>

Кроме того, вы можете оставить ControlTemplate в одиночку и установить HorizontalContentAlignment для каждого ComboBoxItem. Однако я чувствовал, что люди не должны делать это, чтобы заставить мой ComboBoxItem ControlTemplate работать.

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