c# - Win8 ComboBox IsDropDownOpen + 可见性导致 UI 出现故障

标签 c# multithreading xaml microsoft-metro windows-store-apps

我正在使用 XAML 和 C# 开发 Windows 8 应用程序。 我的 ComboBox 有问题,有一个简单的例子来演示它。

  1. 将以下内容添加到布局感知页面(新建 BasicPage)

    <ComboBox x:Name="comboBox1" DropDownClosed="comboBox1_DropDownClosed" Visibility="Collapsed" HorizontalAlignment="Left" Margin="179,217,0,0" Grid.Row="1" VerticalAlignment="Top" Width="998" Height="51">
        <x:String>Option 1</x:String>
        <x:String>Option 2</x:String>
        <x:String>Option 3</x:String>
    </ComboBox>
    <Button Click="Button_Click" Margin="585,130,0,416" Grid.Row="1" Height="82" Width="154">
        <Viewbox>
            <TextBlock Text="Press Me" />
        </Viewbox>
    </Button>
    
  2. 将其添加到页面的代码隐藏

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        comboBox1.Visibility = Windows.UI.Xaml.Visibility.Visible;
        comboBox1.IsDropDownOpen = true;
    }
    
    private void comboBox1_DropDownClosed(object sender, object e)
    {
        comboBox1.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
    }
    

预期: 当按下按钮时,组合框应该出现并且选项应该展开,允许用户选择一个。一旦用户选择了一个选项,组合框就会消失。

实际结果: 按下按钮时,什么也没有发生。如果第二次按下按钮,ComboBox 会出现故障状态,应用程序基本上没有响应。 (所有输入都指向永远不会关闭的 ComboBox。

注意:DropDownClosed 事件在 Button_Click 事件触发后立即触发。删除事件处理程序不会改变任何内容,但有趣的是 DropDownClosed 事件正在触发。

被拒绝的解决方案: 有人建议我在 Visibility 更改生效后使用 Dispatcher.RunAsync 设置 IsDropDownOpen。这似乎是一种竞争条件,因为它只在一些 时间有效。 如果有一种方法可以确认 ComboBox 已呈现为可见,将此检查添加到 RunAsync 方法可以解决问题。

作为解决方法,我目前将 Dispatcher.RunAsync 延迟 200 毫秒,这是一个令人讨厌的解决方法。还有其他想法吗?

最佳答案

你是对的,在尝试设置 IsDropDownOpen 之前,你需要确保 comboBox1 实际上呈现为可见。方法是通过 Dispatcher 进行第二次调用:

private void Button_Click(object sender, RoutedEventArgs e)
{
    comboBox1.Visibility = Windows.UI.Xaml.Visibility.Visible;
    Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => comboBox1.IsDropDownOpen = true);
}

关于c# - Win8 ComboBox IsDropDownOpen + 可见性导致 UI 出现故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15124761/

相关文章:

c# - 该进程无法访问文件 'filename',因为它正被另一个进程使用

c# - 当我单击 GridView 项时返回 ImageView 实例

windows - 将 Windows 手动重置事件移植到 Linux?

java - OSGi 线程永远不会停止运行,为线程定义了固定的生命周期

c# - 文本 block 和标签 wpf 上的文本选择

wpf - 覆盖自定义样式的属性

C# generics - 可以创建具有 n 个泛型类型的方法..?

c# - Selenium : Firefox Driver, 在 c# 中使用 SelectElement 从下拉列表中选择一个项目无法正常工作

c# - 如何使用 WPF 后台 worker

c# - 以编程方式对 wpf 数据网格进行排序