2017-02-05 3 views
0

mycode:Как удалить детей из другой темы?

 Canvas myCanvas = new Canvas(); 
>  Rectangle myRectangle = new Rectangle(); 

>     Task.Factory.StartNew(() => 
>     { 
>       while(true) 
>       { 
>        myCanvas.Children.Clear(); 
>       //do something 
>       for(int i=1;i<=100;i++) 
>       { 
>        myCanvas.Children.Add(myRectangle[i]); 
>       } 
          } 
>     }).ContinueWith(t => 
>     { 
> 
>     }, System.Threading.CancellationToken.None, TaskContinuationOptions.None, 
>     TaskScheduler.FromCurrentSynchronizationContext()); 

я еще получил ошибку: «Указано Визуальная уже потомком другого Визуальное или корень CompositionTarget.» что я должен делать?

+0

Это не имеет ничего общего с резьбой. Вы пытаетесь добавить элемент управления к холсту, когда элемент управления уже добавлен в другой контейнер. Визуальный контроль в WPF не может иметь более одного родителя. – Abion47

+0

Это происходит из-за _while (истинной) _ части во втором цикле, когда визуал уже находится в CanvasX. – Ron

+0

извините, пожалуйста, прочитайте еще раз. Я забыл добавить поток. –

ответ

1

Возможно, вы захотите использовать Dispatcher.Invoke метод.

while (true) 
{ 
    Dispatcher.Invoke(new Action(() => { myCanvas.Children.Clear(); })); 
    for (int i = 1; i <= 100; i++) 
    { 
     Dispatcher.Invoke(new Action(() => { myCanvas.Children.Add(myRectangle[i]); })); 
    } 
} 

Обратите внимание, что Invoke блокирует вызывающий поток.

+0

Это работа !! Большое спасибо. Извините, не могли бы вы объяснить мне, какие разные призывы и начинаются? –

+0

Когда вы используете Invoke, вызывающий поток ждет завершения. Это не относится к BeginInvoke. См. [Эту ссылку] (http://stackoverflow.com/questions/229554/whats-the-difference-between-invoke-and-begininvoke) или google для других объяснений. – Ron

Смежные вопросы