2014-10-01 4 views
1

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

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     System.Threading.Thread thread = new System.Threading.Thread(
     new System.Threading.ThreadStart(
      delegate() 
      { 
       TransformGroup transform = new TransformGroup(); 

       RotateTransform rot = new RotateTransform(45); 
       TranslateTransform trans = new TranslateTransform(500, 500); 


       transform.Children.Add(rot); 
       transform.Children.Add(trans); 

       bOne.Dispatcher.Invoke(
         System.Windows.Threading.DispatcherPriority.Normal, 
         new Action(
          delegate() 
          { 
           bOne.RenderTransform = transform; 
          } 
        )); 
        } 
      )); 


     thread.Start(); 
    } 
} 

где XAML является:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:Custom="http://schemas.microsoft.com/surface/2008" x:Class="Prueba.MainWindow" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 

    <Custom:SurfaceButton Name="bOne" Content="SurfaceButton" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top"/> 
</Grid> 
</Window> 

Тем не менее бросать исключение при попытке изменить bOne.RenderTransform.

ответ

0

Обнаружена проблема, я размещаю здесь правильную версию.

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     System.Threading.Thread thread = new System.Threading.Thread(
     new System.Threading.ThreadStart(
      delegate() 
      { 


       bOne.Dispatcher.Invoke(
         System.Windows.Threading.DispatcherPriority.Normal, 
         new Action(
          delegate() 
          { 
           TransformGroup transform = new TransformGroup(); 

           RotateTransform rot = new RotateTransform(45); 
           TranslateTransform trans = new TranslateTransform(100, 100); 


           transform.Children.Add(rot); 
           transform.Children.Add(trans); 

           bOne.RenderTransform = transform; 
          } 
        )); 
        } 
      )); 


     thread.Start(); 
    } 
} 

Я не понимаю, что преобразование должно быть внутри вызова.

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