Как использовать индикатор выполнения ShowProgressAsync за пределами главного окна?
Я пытаюсь показать индикатор выполнения, пока ищу слова в строке. Я знаю, что есть более простые способы поиска по строкам, но я пытаюсь показать простой пример того, что я хочу без тонны кода.
Главное окно.код XAML.cs
namespace testProgressBars
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow
{
bool isTextBox1Set = false;
public MainWindow()
{
InitializeComponent();
}
public class DocumentSearch
{
public string searchTerm { get; set; }
string myString = "this is a text string that I wanted to search through.";
//This would be async if what I was trying was possible.
public void SearchDoc()
{
int wordCount = myString.Split().Length;
string[] words = myString.Split(' ');
int counter = 0;
foreach (string word in words)
{
counter++;
if (word == searchTerm)
{
MessageBox.Show("yep....it's in here");
}
else
{
MessageBox.Show("nope.....it's not in here.");
}
//I want my progress bar to update here....but this won't work.
//var progressBar = await this.ShowProgressAsync("wait for it", "finding words");
//progressBar.SetProgress((double)counter / (double)wordCount * 100);
}
}
}
private void TextBox1_TextChanged(object sender, TextChangedEventArgs e)
{
if(!String.IsNullOrEmpty(TextBox1.Text))
{
Button1.IsEnabled = true;
}
else
{
Button1.IsEnabled = false;
}
}
private void Button1_Click(object sender, RoutedEventArgs e)
{
//get the word inside of the text field
DocumentSearch docSearch = new DocumentSearch();
docSearch.searchTerm = TextBox1.Text;
docSearch.SearchDoc();
}
}
}
Главное окно.xaml
<Controls:MetroWindow x:Class="testProgressBars.MainWindow"
xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel Name ="StackPanel1" Margin="50">
<TextBox Name="TextBox1" Height="25" Width="100" TextChanged="TextBox1_TextChanged"/>
<Button Name="Button1" Content="Go" IsEnabled="False" Height="25" Width="100" Margin="50" Click="Button1_Click"/>
</StackPanel>
</Grid>
</Controls:MetroWindow>
Я не уверен, как показать индикатор выполнения из класса DocumentSearch, так как я думаю, что проблема с текущим кодом заключается в том, что ShowProgressAsync должен быть как-то связан с классом MainWindow.
Любая помощь ценится.
1 ответ:
Я не знаком с библиотекой MahApps, но я чувствую, что основная проблема заключается в том, что вы не должны делать какие-либо вещи пользовательского интерфейса в
DocumentSearch
. Вместо этого он должен предоставлять крючки, позволяющие вызывающему абоненту получать отчеты о ходе выполнения и управлять самим диалогом. Например:public class DocumentSearch { public string searchTerm { get; set; } string myString = "this is a text string that I wanted to search through."; //This would be async if what I was trying was possible. public async Task<bool> SearchDoc(IProgress<double> progress) { int wordCount = myString.Split().Length; string[] words = myString.Split(' '); int counter = 0; foreach (string word in words) { counter++; if (word == searchTerm) { return true; } progress.Report((double)counter / (double)wordCount * 100); } return false; } }
Называется так:
private async void Button1_Click(object sender, RoutedEventArgs e) { var progressBar = await this.ShowProgressAsync("wait for it", "finding words"); IProgress<double> progress = new Progress<double>(value => progressBar.SetProgress(value)); //get the word inside of the text field DocumentSearch docSearch = new DocumentSearch(); docSearch.searchTerm = TextBox1.Text; bool result = await docSearch.SearchDoc(progress); MessageBox.Show(result ? "yep....it's in here" : "nope.....it's not in here."); }