這適用于 Windows 10,Windows 應用程式 WPF .NET 框架 4.7.2
我有一個舊的 Windows 表單專案(vs 2017 社區)的代碼,用于運行良好的 ProgressBar(Windows 表單專案)。我現在有一個 wpf windows 專案可以正常作業,但我想為兩個按鈕(處理和插入按鈕)單擊事件添加一個進度條,因為它們需要幾秒鐘才能完成,我想看到一些進展。該專案僅適用于我,它始終在 Visual Studio (community 2019) 內運行。我將舊代碼復制到新專案,但進度條不顯示或顯示進度。代碼在舊專案的 buttonclick 事件中,就像在新專案中一樣,但沒有運氣....我可能從舊專案中遺漏了一些東西,但我看不到什么。我知道“無法從呼叫執行緒修改 UI”,但我認為我在 Task.Factory.StartNew 中使用了不同的執行緒。這里有很多關于 Dispatcher.BeginInvoke 的帖子/執行緒,但我找不到與我的類似的帖子/執行緒......其中一個說這種方法是錯誤的方法。我不做 MVVM 的東西。我不經常做 Windows 編程 C# 所以不要以為我知道我在做什么....大聲笑。任何顯示進度條的幫助將不勝感激。關于如何“正確”做到這一點的指標也很感激。謝謝。這是其中一個按鈕 (ProcessButton_Click) 的代碼,其進度條名為“ProgressBarProcess”:任何顯示進度條的幫助將不勝感激。關于如何“正確”做到這一點的指標也很感激。謝謝。這是其中一個按鈕 (ProcessButton_Click) 的代碼,其進度條名為“ProgressBarProcess”:任何顯示進度條的幫助將不勝感激。關于如何“正確”做到這一點的指標也很感激。謝謝。這是其中一個按鈕 (ProcessButton_Click) 的代碼,其進度條名為“ProgressBarProcess”:
private void ProcessButton_Click(object sender, RoutedEventArgs e)
{
if (targetBOMTextBox.Text.Length != 11)
{
MessageBox.Show("Target BOM part number missing or incorrect format.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
Task.Factory.StartNew(() => ProcessButtonFunction());
}
private void ProcessButtonFunction()
{
ProgressBarProcess.Minimum = 1;
ProgressBarProcess.Maximum = 5;
Dispatcher.BeginInvoke(new Action(delegate () { ProgressBarProcess.Visibility = Visibility.Visible; }));
Dispatcher.BeginInvoke(new Action(delegate () { ProgressBarProcess.Value = 1; }));
fillExcelLists();
Dispatcher.BeginInvoke(new Action(delegate () { ProgressBarProcess.Value = 2; }));
convertTofloatList();
Dispatcher.BeginInvoke(new Action(delegate () { ProgressBarProcess.Value = 3; }));
splitDesignatorList();
Dispatcher.BeginInvoke(new Action(delegate () { ProgressBarProcess.Value = 4; }));
fillRecordsList();
Dispatcher.BeginInvoke(new Action(delegate () { ProgressBarProcess.Value = 5; }));
insertButton.IsEnabled = true;
clearButton.IsEnabled = true;
}
private void fillExcelLists()
{
ExcelAccess ExcelAccessOBJ = new ExcelAccess();
//get part numbers from excel column to GlobalData.excelPartNoList
ExcelAccessOBJ.ExcelReadColumn(partNoComboBox.SelectedItem.ToString(), Convert.ToInt16(dataStartRowTextBox.Text), Convert.ToInt16(dataEndRowTextBox.Text), GlobalData.excelPartNoList);
//get quantities from excel column to GlobalData.excelQuantityList
ExcelAccessOBJ.ExcelReadColumn(quantityComboBox.SelectedItem.ToString(), Convert.ToInt16(dataStartRowTextBox.Text), Convert.ToInt16(dataEndRowTextBox.Text), GlobalData.excelQuantityList);
//get designators from excel column to GlobalData.excelDesignatorList
ExcelAccessOBJ.ExcelReadColumn(designatorsComboBox.SelectedItem.ToString(), Convert.ToInt16(dataStartRowTextBox.Text), Convert.ToInt16(dataEndRowTextBox.Text), GlobalData.excelDesignatorList);
}
public class ExcelAccess
{
public void ExcelReadColumn(string column, int rowStart, int rowEnd, List<String> saveData)
{
//set up excel stuff
Microsoft.Office.Interop.Excel.Application ExcelObj = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook theWorkbook = ExcelObj.Workbooks.Open(GlobalData.excelFilenameAndPath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
Microsoft.Office.Interop.Excel.Sheets sheets = theWorkbook.Worksheets;
Microsoft.Office.Interop.Excel.Range data_range;
Microsoft.Office.Interop.Excel.Worksheet sheet = (Microsoft.Office.Interop.Excel.Worksheet)sheets.get_Item(1); //first sheet
//Read column
for (int i = rowStart; i <= rowEnd; i )
{
data_range = sheet.get_Range(column i.ToString(), column i.ToString()); //read part number from excel sheet
//Convert cell value to string
string tempString = Convert.ToString(data_range.Cells.Value2);
if (tempString != string.Empty)
{
saveData.Add(tempString);
}
}
theWorkbook.Close();
ExcelObj.Quit();
}
}
uj5u.com熱心網友回復:
留在調度程式執行緒上并等待在后臺執行緒上執行長時間運行方法的任務:
private async void ProcessButton_Click(object sender, RoutedEventArgs e)
{
if (targetBOMTextBox.Text.Length != 11)
{
MessageBox.Show("Target BOM part number missing or incorrect format.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
ProgressBarProcess.Visibility = Visibility.Visible;
ProgressBarProcess.Minimum = 1;
ProgressBarProcess.Maximum = 5;
ProgressBarProcess.Value = 1;
await Task.Run(() => fillExcelLists());
ProgressBarProcess.Value = 2;
await Task.Run(() => convertTofloatList());
ProgressBarProcess.Value = 3;
await Task.Run(() => splitDesignatorList());
ProgressBarProcess.Value = 4;
await Task.Run(() => fillRecordsList());
ProgressBarProcess.Value = 5;
insertButton.IsEnabled = true;
clearButton.IsEnabled = true;
}
沒有必要真正涉及調度員。
uj5u.com熱心網友回復:
這是我最終做的和作業的。我要感謝大家的幫助。我遇到的主要問題似乎是我從不應該訪問的地方訪問 UI。此外 ProgressBarProcess.Minimum 和 ProgressBarProcess.Maximum 似乎在我閱讀(鏈接)時不起作用,可能是我錯過了。再次感謝:
private void ProcessButton_Click(object sender, RoutedEventArgs e)
{
if (targetBOMTextBox.Text.Length == 11)
{
GlobalData.TargetBOMpartNo = targetBOMTextBox.Text;
GlobalData.partNoColumn = partNoComboBox.SelectedItem.ToString();
GlobalData.quantityColumn = quantityComboBox.SelectedItem.ToString();
GlobalData.designatorColumn = designatorsComboBox.SelectedItem.ToString();
GlobalData.dataRowStart = Convert.ToInt16(dataStartRowTextBox.Text);
GlobalData.dataRowEnd = Convert.ToInt16(dataEndRowTextBox.Text);
}
else
{
MessageBox.Show("Target BOM part number missing or incorrect format.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
ProcessButton.IsEnabled = false;
Task.Factory.StartNew(() => ProcessButtonFunction());
}
private void ProcessButtonFunction()
{
Dispatcher.BeginInvoke(new Action(delegate () { ProgressBarProcess.Visibility = Visibility.Visible; }));
Dispatcher.BeginInvoke(new Action(delegate () { ProgressBarProcess.Value = 10; }));
fillExcelLists();
convertTofloatList();
splitDesignatorList();
fillRecordsList();
Dispatcher.BeginInvoke(new Action(delegate () { ProgressBarProcess.Value = 100; }));
//insertButton.IsEnabled = true; //this generates an exception do it like below
Dispatcher.BeginInvoke(new Action(delegate () { insertButton.IsEnabled = true; }));
//clearButton.IsEnabled = true; //this generates an exception do it like below
Dispatcher.BeginInvoke(new Action(delegate () { clearButton.IsEnabled = true; }));
Dispatcher.BeginInvoke(new Action(delegate () { ProgressBarProcess.Visibility = Visibility.Hidden; }));
}
private void fillExcelLists()
{
ExcelAccess ExcelAccessOBJ = new ExcelAccess();
//get part numbers from excel column to GlobalData.excelPartNoList
ExcelAccessOBJ.ExcelReadColumn(GlobalData.partNoColumn, GlobalData.dataRowStart, GlobalData.dataRowEnd, GlobalData.excelPartNoList);
Dispatcher.BeginInvoke(new Action(delegate () { ProgressBarProcess.Value = 30; }));
//get quantities from excel column to GlobalData.excelQuantityList
ExcelAccessOBJ.ExcelReadColumn(GlobalData.quantityColumn, GlobalData.dataRowStart, GlobalData.dataRowEnd, GlobalData.excelQuantityList);
Dispatcher.BeginInvoke(new Action(delegate () { ProgressBarProcess.Value = 60; }));
//get designators from excel column to GlobalData.excelDesignatorList
ExcelAccessOBJ.ExcelReadColumn(GlobalData.designatorColumn, GlobalData.dataRowStart, GlobalData.dataRowEnd, GlobalData.excelDesignatorList);
Dispatcher.BeginInvoke(new Action(delegate () { ProgressBarProcess.Value = 90; }));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/357933.html
