#2 Dejv
Ahoj,
spíš bys měl dodat, jestli to je WinForm nebo WPF.
Budu mluvit pouze o WPF.
Problém je v tom, že BackgroundWorker běží v jiném vlákně a z cizího vlákna nemůžeš přistupovat na UI.
Vylítne ti to na InvalidOperationException s komentářem:
- The calling thread cannot access this object because a different thread owns it.
Jediné, jak je možné to obejít je využít Dispatchera a použít Invoke.
XAML
<Window x:Class="WpfApplication1.MainWindow"
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>
<Label Content="Test" FontWeight="Bold" />
<CheckBox Name="chckBox" Content="Pokus" />
<Button Name="btnTest" Content="test" Click="btnTest_Click" />
</StackPanel>
</Grid>
</Window>
CodeBehind
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void btnTest_Click(object sender, RoutedEventArgs e)
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += worker_DoWork;
worker.RunWorkerAsync(this);
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
Thread.Sleep(2000);
MainWindow w = (MainWindow)e.Argument;
// vyhodi vyjimku
// w.ChangeCheckBox(true);
// probehne v poradku
w.Dispatcher.Invoke(
new Action<bool>(ChangeCheckBox),
new object[] { true }
);
}
public void ChangeCheckBox(bool check)
{
chckBox.IsChecked = check;
}
}
}
Snad ti to pomůže :)
Evžen