Wpf 如何在打开组合框项目列表之前显示警告窗口?

Wpf 如何在打开组合框项目列表之前显示警告窗口?,wpf,combobox,popup,Wpf,Combobox,Popup,我的要求是在单击WPF组合框时显示一个警告窗口(在某些特定条件下),在它显示可供选择的可用项列表之前。窗口询问用户是否继续 问题是,显示此警告窗口后,无论我是否将属性IsDropDownOpen设置为打开,应显示以选择项目的组合框弹出窗口都未打开。有关详细信息,请参见代码 <Window x:Class="ComboBoxTester.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentati

我的要求是在单击WPF组合框时显示一个警告窗口(在某些特定条件下),在它显示可供选择的可用项列表之前。窗口询问用户是否继续

问题是,显示此警告窗口后,无论我是否将属性IsDropDownOpen设置为打开,应显示以选择项目的组合框弹出窗口都未打开。有关详细信息,请参见代码

<Window x:Class="ComboBoxTester.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<StackPanel>
    <ComboBox Height="20" PreviewMouseDown="ComboBox_PreviewMouseDown">
        <ComboBoxItem>Item 1</ComboBoxItem>
        <ComboBoxItem>Item 2</ComboBoxItem>
        <ComboBoxItem>Item 3</ComboBoxItem>
    </ComboBox>
    <CheckBox x:Name="warningConditionCheckBox" >Is warning condition?</CheckBox>
</StackPanel>
</Window>

项目1
项目2
项目3
是否处于警告状态?
代码背后包含:

namespace ComboBoxTester {
using System.Windows.Input;

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void ComboBox_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        if (warningConditionCheckBox.IsChecked == true)
        {
            // Warn about this situation
            var window = new MyDialog { Owner = GetWindow(this) };

            // Confirm to proceed
            if (window.ShowDialog() != true) {
                e.Handled = true;
            } 
            else {
                comboBox.IsDropDownOpen = true;
            }
        }
    }
}
}
命名空间ComboxTester{ 使用System.Windows.Input; /// ///MainWindow.xaml的交互逻辑 /// 公共部分类主窗口 { 公共主窗口() { 初始化组件(); } private void组合框_PreviewMouseDown(对象发送器,鼠标按钮ventargs e) { if(warningConditionCheckBox.IsChecked==true) { //警告这种情况 var window=newmydialog{Owner=GetWindow(this)}; //确认继续 if(window.ShowDialog()!=true){ e、 已处理=正确; } 否则{ comboBox.IsDropDownOpen=true; } } } } } MyDialog只是一个对话框窗口:

<Window x:Class="ComboBoxTester.MyDialog"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MyDialog" Height="150" Width="300">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="40"/>
    </Grid.RowDefinitions>
    <Border Background="Silver">
        <TextBlock Text="Warning! Sure to proceed?" TextAlignment="Center"/>
    </Border>

    <StackPanel Grid.Row="1">
        <Button Width="100" Content="OK" IsDefault="True" Click="ButtonOkClick"/>
        <Button Width="100" Content="Cancel" IsCancel="True"/>
    </StackPanel>
</Grid>
</Window>


命名空间ComboxTester{ 使用System.Windows; /// ///MyDialog.xaml的交互逻辑 /// 公共部分类MyDialog { 公共MyDialog() { 初始化组件(); } 私有无效按钮单击(对象发送方,路由目标) { DialogResult=true; } } }
我的想法是使用WPF组合框来处理这个需求。如果可能的话,不要创建另一个控件。所以显示窗口后,如何查看此组合框中的项目列表?任何建议都有帮助。

在WPF中,当您在事件处理程序中时,您可以设置其他UI控件的属性,但这些属性没有得到正确处理,这通常是一个问题

但您可以通过dispatcher调用您的更改,dispatcher将在UI消息队列中对您的请求进行排队,并在事件处理程序之后对其进行正确处理:

而不是

  comboBox.IsDropDownOpen = true;
使用:

  comboBox.IsDropDownOpen = true;
  Action action = () => comboBox.IsDropDownOpen = true;
  Application.Current.Dispatcher.BeginInvoke(action);