【发布时间】:2017-03-03 17:28:39
【问题描述】:
在按下按钮并且按钮正在运行其进程后,我试图在我的主窗口中合并一个进度条。我知道我只是缺少一些简单的东西,但我对 WPF 还是很陌生,因为我主要使用 Windows 窗体。
我的 XML 结构如下:
<Window x:Class="Program1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Program1"
mc:Ignorable="d"
Title="Program1" Height="1029" Width="1300" SnapsToDevicePixels="True" BorderThickness="0" Margin="0" ResizeMode="NoResize" Closing="Window_Closing"
x:Name="FirstWindow">
<Grid x:Name="Grid1">
<Button x:Name="btnPopulate" Content="Populate" HorizontalAlignment="Left" Margin="243,66,0,0" VerticalAlignment="Top" Width="118" Height="29" Click="btnPopulate_Click"/>
<Button x:Name="btnClear" Content="Clear" HorizontalAlignment="Left" Margin="366,66,0,0" VerticalAlignment="Top" Width="118" Height="29" Click="btnClear_Click"/>
<ProgressBar x:Name="progressBar" HorizontalAlignment="Left" Height="30" Margin="10,943,0,0" VerticalAlignment="Top" Width="351"/>
</Grid>
</Window>
我的填充按钮点击方法如下:
private void btnPopulate_Click(object sender, RoutedEventArgs e)
{
Thread backgroundThread = new Thread(
new ThreadStart(() =>
{
for (int n = 0; n < 100; n++)
{
Thread.Sleep(50);
progressBar.Value = n;
};
}
));
backgroundThread.Start();
}
我面临的问题是我收到此错误:
当前上下文中不存在名称“progressBar”
我不确定如何通过按钮单击方法访问 progressBar 控件。
我知道我可能遗漏了一些简单的东西,但我仍在尝试掌握 WPF。
【问题讨论】:
-
首先,标记是 XAML(这在技术上是 XML)。您还应该使用 MVVM 模式进行调查;使用像 WinForms 这样的 WPF 是一种快速解决问题的方法。
-
您不能使用创建它们的线程以外的线程中的 WPF 控件。 (通常是 UI 线程)所以你正在做的不会工作。
-
虽然@BrandonKramer 是正确的;如果您通过绑定进行更新,您会很好(那些自动编组到 UI 线程)。您还可以使用
Dispatcher.BeginInvoke编组到 UI 线程 -
所有这些对于 SO 来说都太宽泛了,但是一旦你获得 20 个代表,你可以考虑在 WPF 聊天室中提问,同时沿着 MVVM 路径前进:chat.stackoverflow.com/rooms/18165/wpf