好吧,我有作爲一個Windows的目錄樹一個TreeView。我已經加載了所有的目錄並正常運行,但它在加載具有許多子目錄的目錄時正在暫停我的GUI。我試圖實現多線程,但對它來說是新的,並且沒有運氣。需要幫助實現多線程進入我的TreeView(C#,WPF)
這是我爲我的TreeView:
private readonly object _dummyNode = null;
public MainWindow()
{
InitializeComponent();
foreach (string drive in Directory.GetLogicalDrives())
{
DriveInfo Drive_Info = new DriveInfo(drive);
if (Drive_Info.IsReady == true)
{
TreeViewItem item = new TreeViewItem();
item.Header = drive;
item.Tag = drive;
item.Items.Add(_dummyNode);
item.Expanded += folder_Expanded;
TreeViewItemProps.SetIsRootLevel(item, true);
Dir_Tree.Items.Add(item);
}
}
}
private void folder_Expanded(object sender, RoutedEventArgs e)
{
TreeViewItem item = (TreeViewItem)sender;
if (item.Items.Count == 1 && item.Items[0] == _dummyNode)
{
item.Items.Clear();
try
{
foreach (string dir in Directory.GetDirectories(item.Tag as string))
{
DirectoryInfo tempDirInfo = new DirectoryInfo(dir);
bool isSystem = ((tempDirInfo.Attributes & FileAttributes.System) == FileAttributes.System);
if (!isSystem)
{
TreeViewItem subitem = new TreeViewItem();
subitem.Header = tempDirInfo.Name;
subitem.Tag = dir;
subitem.Items.Add(_dummyNode);
subitem.Expanded += folder_Expanded;
subitem.ToolTip = dir;
item.Items.Add(subitem);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
每當我展開有大量子目錄的目錄,程序似乎被凍結了幾秒鐘。我想在處理過程中顯示加載消息或動畫,但我不確定如何從多線程開始。我知道我必須使用TreeView的Dispatcher.BeginInvoke方法,但除此之外,我有點失落。
任何幫助將不勝感激!
非常感謝您的回覆,但我仍然有麻煩。按照您的建議,我已將folder_Expanded事件的內容移至RenderTreeView方法,但該代碼引用了發件人對象,並且我無法讓發件人通過該操作。我有點新東西,所以如果這是一個簡單的「新手」錯誤,請原諒我。 – 2010-09-23 15:48:57
我添加了一個快速示例,瞭解重新分解代碼的外觀。抱歉,無法將命名約定修改爲更友好的內容。 – TheCodeKing 2010-09-23 17:28:34
工程就像一個魅力!非常感謝你!!! – 2010-09-23 19:16:18