2012-02-07 4 views
0

Voici mon codeDiscussion dans la fenêtre

public partial class MainWindow : Window 
{ 
    Thread ProgressThread; 
    Window w; 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     ProgressThread = new Thread(() => 
     { 
      w = new Window(); 
      RoundProgressBar objprogress=new RoundProgressBar(); 
      w = new Window(); 
      w.Margin = new Thickness(0, 0, 50, 0); 
      w.WindowState = WindowState.Normal; 
      w.WindowStartupLocation = WindowStartupLocation.CenterOwner; 
      w.Height = 80; 
      w.Width = 80; 
      w.ResizeMode = ResizeMode.NoResize; 
      w.AllowsTransparency = true; 
      w.WindowStyle = WindowStyle.None; 
      RoundProgressBar Progress = new RoundProgressBar(); 
      w.Content = objprogress; 
      w.ShowInTaskbar = false; 
      w.ShowDialog(); 
      w.Content = Progress; 
      w.ShowInTaskbar = false; 
      w.ShowDialog(); 

      w.Closed += (sender2, e2) => 
      w.Dispatcher.InvokeShutdown(); 

      System.Windows.Threading.Dispatcher.Run(); 
     }); 

     ProgressThread.SetApartmentState(ApartmentState.STA); 
     ProgressThread.Start(); 
    } 
} 

quand je clique sur le fil du bouton démarrer la barre de progression au milieu de l'écran .Lorsque je change écran principal que la fenêtre de la barre de progree ne change pas.

Je veux afficher cette barre de progression au milieu de cette fenêtre. si je déménage n'importe où.

w.Owner = this;

Je sais que, avec l'aide de ce code cela fonctionnera perfect.but je travaille dans le fil de sorte cette erreur est survenue

« Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread est le propriétaire »

S'il vous plaît aidez-moi hors de ce problème

Répondre

2

Les objets de l'interface utilisateur sont sur le thread UI. Vous voulez avoir un thread d'arrière-plan qui surveille la progression, mais ensuite tout ce que vous voulez mettre à jour sur l'interface utilisateur, vous devez envoyer à nouveau le thread d'interface utilisateur.

Quelque chose le long de ces lignes:

private void button1_Click(object sender, RoutedEventArgs e) { 
    Task t = Task.Factory.StartNew(UpdateUI); 
} 

private void UpdateUI() { 
    Dispatcher.Invoke(
     new Action(() => { 
      textBox1.Text = "Henk"; 
      // etc etc, this would be your normal code 
     }) 
); 
} 

Cet article explique: http://msdn.microsoft.com/en-us/magazine/cc163328.aspx. Si vous pouvez utiliser async, alors vous devriez regarder this par exemple. Voilà comment cette douleur disparaît le plus souvent pour ces problèmes.

Cordialement, Gert-Jan

Questions connexes