我正在使用XAML和C#开发Windows 8应用程序。 我的ComboBox有问题,并有一个简单的例子来演示它。
将以下内容添加到Layout Aware页面(New 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>
将此添加到页面的CodeBehind
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就会消失。
实际结果 按下按钮时,没有任何反应。如果再次按下该按钮,ComboBox将出现在一个闪烁的状态,并且该应用程序基本上没有响应。 (所有输入都指向ComboBox,它永远不会关闭。
注意:Drop_LownClosed事件在Button_Click事件发生后立即触发。删除事件处理程序不会改变任何内容,但有趣的是DropDownClosed事件正在触发。
拒绝解决方案:
有人建议我在Dispatcher.RunAsync
更改生效后使用IsDropDownOpen
设置Visibility
。这似乎是一种竞争条件,因为它只能起作用一些。 如果有办法确认ComboBox已呈现可见,将此检查添加到RunAsync方法可以解决问题。
作为一种解决方法,我目前将Dispatcher.RunAsync延迟200毫秒,这是一个令人烦恼的解决方法。还有其他想法吗?
答案 0 :(得分:1)
你是对的,在尝试设置comboBox1
之前,你需要确保IsDropDownOpen
实际上是可见的。这样做的方法是通过Dispatcher
进行第二次通话:
private void Button_Click(object sender, RoutedEventArgs e)
{
comboBox1.Visibility = Windows.UI.Xaml.Visibility.Visible;
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => comboBox1.IsDropDownOpen = true);
}
答案 1 :(得分:1)
多么讨厌的虫子啊?
一个简单的解决方法是使用“不透明度”,而不是使用“可见性”属性。它按预期工作:
<ComboBox x:Name="comboBox1" DropDownClosed="comboBox1_DropDownClosed" Opacity="0" 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>
private void Button_Click(object sender, RoutedEventArgs e) {
comboBox1.Opacity = 1;
comboBox1.IsDropDownOpen = true;
}
private void comboBox1_DropDownClosed(object sender, object e) {
comboBox1.Opacity = 0;
}
干杯!
答案 2 :(得分:0)
我在桌面和Surface设备上测试了以下内容,它似乎一直都在运行。这是延迟设置IsDropDownOpen
的变体。我知道你可能已经尝试了一些产生竞争条件的变种。我没有看到比赛条件,所以希望它对你也有用。
// need this for Task
using System.Threading.Tasks;
...
// note async keyword added to function signature
async private void Button_Click(object sender, RoutedEventArgs e)
{
comboBox1.Visibility = Windows.UI.Xaml.Visibility.Visible;
// add small delay before opening dropdown
await Task.Delay(1);
comboBox1.IsDropDownOpen = true;
}