Mam przycisku ComboBoxItem i chciałbym zapobiec upuścić ComboBox. Najwyraźniej wydaje się, że przycisk pęka zdarzenie Click do ComboBoxItem, powodując upadek do załamania.

<ComboBox DropDownOpened="OnWindowsDropDownOpened">
    <ComboBox.ItemTemplateSelector>
        <s:ComboBoxItemTemplateSelector>
            <s:ComboBoxItemTemplateSelector.SelectedTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Description}" />
                </DataTemplate>
            </s:ComboBoxItemTemplateSelector.SelectedTemplate>
            <s:ComboBoxItemTemplateSelector.DropDownTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
                        <Button Command="{Binding DataContext.HighlightWindow, ElementName=Windows}" CommandParameter="{Binding}" MouseDown="Button_MouseDown" Click="Button_Click">
                            <md:PackIcon Kind="Target" />
                        </Button>
                        <TextBlock Text="{Binding Description}" />
                    </StackPanel>
                </DataTemplate>
            </s:ComboBoxItemTemplateSelector.DropDownTemplate>
        </s:ComboBoxItemTemplateSelector>
    </ComboBox.ItemTemplateSelector>
    <ComboBox.ItemContainerStyle>
        <Style BasedOn="{StaticResource MaterialDesignComboBoxItemStyle}" TargetType="ComboBoxItem">
            <Setter Property="IsEnabled" Value="{Binding Valid}" />
            <Setter Property="ToolTip">
                <Setter.Value>
                    <TextBlock Text="{Binding Title}" />
                </Setter.Value>
            </Setter>
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

Jak widać, próbowałem obu MouseDown i Click, obsługującym wydarzenie, w następujący sposób:

private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
{
    e.Handled = true;
}

private void Button_MouseDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
}

Jak mogę to zrobić? Czy można również użyć tylko kodu MVVM (kod oparty na XAML, nie C #)?

Oto zrzut ekranu Combobox Otwarty

2
Yves Calaci 14 kwiecień 2021, 20:52

2 odpowiedzi

Najlepsza odpowiedź

Jeden, ale nie testowałeś jeszcze PreviewMouseLeftButtonDown i zrób to przez ComboBox. Albo możesz wziąć kolejne wydarzenie Preview*.

private void Button_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = sender is Button;
}

<ComboBox DropDownOpened="OnWindowsDropDownOpened" PreviewMouseLeftButtonDown="Button_PreviewMouseLeftButtonDown">
1
Rekshino 14 kwiecień 2021, 18:59

W WPF elementy są wybierane na podstawie ich zachowania, a nie ich wizualnego wyglądu.
Zachowanie ComboBox (w tym) jest upadek, gdy wybrany jest element.
Jeśli tego nie potrzebujesz, ale potrzebujesz wyraźnego, oddzielnych akcji od użytkownika, aby zwinąć listę, a następnie użyj innego elementu lub kombinacji ich.

Moim zdaniem ekspander z zagnieżdżonym listką będzie najbardziej wygodna dla Twojego zadania.

0
EldHasp 14 kwiecień 2021, 18:33