我正在WPF中设计一个应用程序,如果您单击一个按钮,它将加载该应用程序。例如,您按Spotify,它将加载Spotify。
事实是,有时打开应用程序(Spotify)会有延迟,这很正常!因此,我要添加一个加载区域,以便隐藏徽标,并且加载面板将显示在其位置!
效果不错,但我遇到了问题!出于某种原因,gui不会随我的加载而更新,而是先加载我的应用程序,然后在稍后用我的加载栏更新GUI的一会儿。我想要这样,所以只要用户按下按钮,他们便会立即看到此加载出现,然后在成功加载应用程序后消失。
按钮代码:
Dim syncTask As New Task(Of Long)(Function()
MPanel_Spotify.Visibility = Windows.Visibility.Hidden 'Hide Button Info
LoadPanel_Spotify.Visibility = Windows.Visibility.Visible 'Show Load
Dim LPro = Process.Start(SpotifyGlobalDir)
Console.WriteLine("Loading App")
LPro.WaitForInputIdle()
Dim ProcessCheck = Process.GetProcessesByName("Spotify")
Do
Thread.Sleep(2000)
Loop Until ProcessCheck.Count > 0
Console.WriteLine("App loaded")
' LoadPanel_Spotify.Visibility = Windows.Visibility.Hidden 'Hide Load
'MPanel_Spotify.Visibility = Windows.Visibility.Visible 'Show Button Info
Return True
End Function)
syncTask.RunSynchronously()
我认为我可能需要一些多线程?但是,如果这样做,我会收到错误,因为我需要调用不知道怎么做的可见性更改?
答案 0 :(得分:1)
尝试在后台线程上调用Process.Start
和Thread.Sleep
,但在UI线程上设置元素的Visibility
属性:
MPanel_Spotify.Visibility = Windows.Visibility.Hidden 'Hide Button Info
LoadPanel_Spotify.Visibility = Windows.Visibility.Visible 'Show Load
Task.Run(Sub()
Dim LPro = Process.Start(SpotifyGlobalDir)
Console.WriteLine("Loading App")
LPro.WaitForInputIdle()
Dim ProcessCheck = Process.GetProcessesByName("Spotify")
Do
Thread.Sleep(2000)
Loop Until ProcessCheck.Count > 0
End Sub) _
.ContinueWith(Sub(t)
Console.WriteLine("App loaded")
LoadPanel_Spotify.Visibility = Windows.Visibility.Hidden 'Hide Load
MPanel_Spotify.Visibility = Windows.Visibility.Visible 'Show Button Info
End Sub, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext())
UI线程不能同时显示控件和休眠。一个线程一次只能做一件事。