我想你是不是提供了足夠的代碼,以找出問題。但事實是,您的用戶界面被阻止。
請嘗試以下操作,也許它可以幫助您找出結果(不使用Task
,因爲它在.NET Framework 3.5
中不可用)。它試圖模擬你長時間運行的方法LoadDevices()
,同時保持UI的響應。
MainWindows.xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="120"
Width="400">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition />
</Grid.RowDefinitions>
<Button Click="UpdateButtonClick" Grid.Row="0">Update</Button>
<TextBox Name="TextStatus" Text="" TextWrapping="Wrap" Grid.Row="1"></TextBox>
</Grid>
</Window>
MainWindows.xaml.cs
using System;
using System.Threading;
using System.Windows;
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void UpdateButtonClick(object sender, RoutedEventArgs e)
{
UpdateStatus("Searching for devices, please wait");
var thread = new Thread(LoadDevices);
thread.Start();
}
private void LoadDevices()
{
// Your long running "load devices" implementation goes here
for (int i = 0; i < 15; i++)
{
Dispatcher.BeginInvoke((Action) (() => UpdateStatus(".")));
Thread.Sleep(250);
}
Dispatcher.BeginInvoke((Action)(() => UpdateStatus(" done")));
}
private void UpdateStatus(string status)
{
TextStatus.AppendText(status);
}
}
}
但是,是的,你應該更喜歡MVVM,數據綁定,命令等。並儘量避免填充邏輯代碼隱藏。
「TextStatus」是否綁定到您的文本框?它是一個DependencyProperty? – PoweredByOrange 2014-10-17 16:32:44
*看起來似乎應該起作用,儘管利用綁定會更好。 – BradleyDotNET 2014-10-17 16:33:06
請注意,使用WPF時,最好使用MVVM模式。使許多事情變得更容易等 – walther 2014-10-17 16:43:42