2

私の要件は、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>

背後にあるコードには次のものが含まれています。

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;
            }
        }
    }
}
}

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>

namespace ComboBoxTester {
using System.Windows;

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

    private void ButtonOkClick(object sender, RoutedEventArgs e)
    {
        DialogResult = true;
    }
}
}

私の考えは、この要件に対処するためにWPFコンボボックスを使用することです。また、可能であれば、別のコントロールを作成しないようにします。だから...ウィンドウを表示した後、このコンボボックスからアイテムのリストを表示するにはどうすればよいですか?どんな提案も役に立ちます。

4

1 に答える 1

1

これは、イベントハンドラーを使用しているときに、他のUIコントロールのプロパティを設定できるが、正しく処理されないというWPFの問題であることがよくあります。

ただし、ディスパッチャを介して変更を呼び出すことができます。ディスパッチャは、リクエストをUIメッセージキューにキューイングし、イベントハンドラの後に適切に処理されます。

それ以外の

  comboBox.IsDropDownOpen = true;

使用する:

  Action action = () => comboBox.IsDropDownOpen = true;
  Application.Current.Dispatcher.BeginInvoke(action);
于 2012-06-26T07:48:52.283 に答える