我是 wpf 和 c# 的新手,也是在这里问的。我在网上搜索了几个小时,但我还没有找到解决我的问题的方法。我有一个进度条,可以在循环增加时更新它的值,还有一个更新它的文本的文本块(例如:Reading Lines 5/3000)。目前,我没有绑定路径,所以我在我的 xaml 中进行了虚拟绑定。我不知道如何使它工作。
这是我的 XAML:
<xctk:BusyIndicator x:Name="_busyIndicator" Grid.Row="4">
<xctk:BusyIndicator.BusyContentTemplate>
<DataTemplate>
<StackPanel Margin="4">
<TextBlock Text="Parsing OTM File" FontWeight="Bold" HorizontalAlignment="Center" />
<StackPanel Margin="4">
<TextBlock Text="{Binding NumberOfLinesOfStringInTextFile}" />
<ProgressBar Grid.Row="4" Name="prgParse" Height="15" Value="{Binding CurrentLineNumberAddedToListView}" />
</StackPanel>
</StackPanel>
</DataTemplate>
</xctk:BusyIndicator.BusyContentTemplate>
<xctk:BusyIndicator.OverlayStyle>
<Style TargetType="Rectangle">
<Setter Property="Fill" Value="#ffffeeee"/>
</Style>
</xctk:BusyIndicator.OverlayStyle>
<xctk:BusyIndicator.ProgressBarStyle>
<Style TargetType="ProgressBar">
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
</xctk:BusyIndicator.ProgressBarStyle>
<ListBox x:Name="_listBox" />
</xctk:BusyIndicator>
我有一个按钮触发读取文本文件中的行(在本例中它有 3000 多行)并将字符串行放置到列表视图中的循环。我想更新我的 xaml 中的文本块,该文本块指出“读取行 300/3000”和进度条指示它的百分比,它在将数据传输到列表视图时将其值更新为 10 或 10%。
这是我背后的代码:
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
private void cmdBrowse_Click(object sender, RoutedEventArgs e)
{
var OpenOTM = new Microsoft.Win32.OpenFileDialog();
OpenOTM.DefaultExt = ".otm";
OpenOTM.Filter = "OTM Files (*.otm)|*.otm|TEXT Files (*.txt)|*.txt";
if (OpenOTM.ShowDialog().GetValueOrDefault(false))
{
txtFilePath.Text = OpenOTM.FileName;
}
}
private void cmdOk_Click(object sender, RoutedEventArgs e)
{
WithAdjustments wa = new WithAdjustments();
BackgroundWorker worker = new BackgroundWorker();
string[] lines = System.IO.File.ReadAllLines(txtFilePath.Text);
worker.DoWork += (o, ea) =>
{
List<String> listOfString = new List<string>();
foreach (string lin in lines)
{
listOfString.Add(lin);
Thread.Sleep(2);
}
Dispatcher.Invoke((Action)(() => _listBox.ItemsSource = listOfString));
};
worker.RunWorkerCompleted += (o, ea) =>
{
_busyIndicator.IsBusy = false;
};
_busyIndicator.IsBusy = true;
worker.RunWorkerAsync();
}
}
提前致谢!我希望有一个人可以帮助我 :)