弹出窗口打不开

本文关键字:窗口 | 更新日期: 2023-09-27 18:15:33

我有一个看似简单的问题:一个给我带来麻烦的弹出窗口在精简版本中看起来是这样的(完整版本在Border元素中有一个微调器UserControl,但奇怪的行为是相同的)。XAML是这样的:

<Popup Name="PleaseWaitPopup" Placement="Center" IsOpen="False" StaysOpen="True" Opened="PopupOpened" Closed="PopupClosed">
    <Border Width="200" Height="200" Padding="20" Background="#222">
        <StackPanel Orientation="Vertical">
            <TextBlock Name="WaitHeadTxt" Margin="0 0 0 36" Style="{StaticResource PopupHeadStyle}" VerticalAlignment="Top" FontSize="16"></TextBlock>
            <Border Width="60" Height="60">
            </Border>
        </StackPanel>
    </Border>
</Popup>

所有的元素(PopupOpened(), PopupClosed(), PopupHeadStyle)都经过了很好的测试,并且在同一项目中的许多其他弹出窗口中工作良好。

作为对用户操作的响应,我想在开始需要几秒钟才能完成的事情(试图通过WiFi连接设备)之前打开这个弹出框。代码也很简单:

PleaseWaitPopup.IsOpen = true;
try
{
    wifiDeviceProvider = new PtpIpProvider();
    DeviceManager.AddDevice(wifiDeviceProvider.Connect("192.168.1.1"));
}
catch (Exception ex)
{
...
}

在我的测试用例中,我没有连接外部设备,因此WiFi连接尝试在10秒后超时返回。弹出窗口始终只在超时后打开,我没有得到。此时没有其他弹出窗口打开。

我用其他动作代码(FTP传输而不是WiFi连接)尝试了这个-问题仍然存在,所以WiFi连接代码不太可能与此有任何关系。尝试通过打开弹出窗口或WiFi连接来使事情异步,或两者兼而有之,在一个单独的线程中通过"this.Dispatcher.Invoke(() =>{…});",但这些都无济于事。

你知道我在这里错过了什么吗?一定是什么蠢事,但我似乎想不出来。谢谢!

弹出窗口打不开

你的WiFi代码看起来阻塞了UI线程之前,它有机会更新UI。因此,一旦它从那个(即超时)返回,它就会更新。

作为一种基本的解决方法,您可以使用如下命令:

PleaseWaitPopup.IsOpen = true;
Task.Run(() =>
{
    try
    {
        wifiDeviceProvider = new PtpIpProvider();
        DeviceManager.AddDevice(wifiDeviceProvider.Connect("192.168.1.1"));
    }
    catch (Exception ex)
    {
        ...
    }
});

请注意,catch块不在UI线程上,所以不要尝试在没有针对UI线程的情况下更新UI。还要注意,在该代码中,任务将立即返回—如果想等待任务,则需要进行一些更改。

理想情况下,你会想要完全异步。我建议阅读Stephen Cleary的文章,以获得有关异步最佳实践的更多信息。例如Async/Await -异步编程的最佳实践