2013-09-04 2 views
0

Вот мой код, который вращает мой объект. Мне нужно вращать два типа объектов.Преобразование не работает правильно

инициализации:

private TransformGroup trGrp; 
     private RotateTransform trRot; 
     private TransformGroup trGrp1; 
     private RotateTransform trRot1; 
     static private double angle; 
     SerialPort port; 
     value v; 
     string result; 
     public int zeroValue; 
     public MainWindow() 
     { 
      InitializeComponent(); 
      angle = 0; 
      zeroValue = 327; 
      trGrp = new TransformGroup(); 
      trRot = new RotateTransform(angle) { CenterX = rectangle1.Width/2, CenterY = rectangle1.Height }; 
      trGrp1 = new TransformGroup(); 
      trRot1 = new RotateTransform(angle) { CenterX = rectangle1.Width/2, CenterY = rectangle1.Height }; 
      // trGrp.Children.Add(trRot); 
      //trGrp1.Children.Add(trRot1); 
      v = new value(); 
      port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); 
      port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); 
      port.Open(); 
     } 

Код для последовательного порта, полученные данные:

void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 
      if (!port.IsOpen) 
      { 
       port.Open(); 
      } 

      try 
      { 
       result = port.ReadLine(); 
       result = result.Replace("\r", ""); 
      } 

      catch (Exception e1) 
      { MessageBox.Show(e1.Message); } 
      int[] temp = new int[4]; 
      this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, 
     new Action(
      delegate() 
      { 


       try 
       { 

         temp[0] = int.Parse(result[1].ToString() + result[2].ToString() + result[3].ToString() + result[4].ToString()); 

         if (temp[0] == zeroValue) 
         { 

          trRot.Angle = 0; 
          trGrp.Children.Add(trRot); 
          rectangle1.RenderTransform = trGrp; 
          trGrp.Children.RemoveAt(0);//because Add function adds a new trGrp so its size increases and we do not need old trGrp so we remove them. 
          label3.Content = trRot.Angle.ToString(); 

         } 

         else if (temp[0] > zeroValue) 
         { 

          int totalValues = temp[0] - zeroValue; 
          if (totalValues == 1) 
          { 
           totalValues = 0; 
          } 
          textBox3.Text = temp[0].ToString(); 
          angle = totalValues * Properties.Settings.Default.angle; 

          if (angle<31) 
          { 
           trRot.Angle = angle/2; 
           trGrp.Children.Add(trRot); 
           rectangle1.RenderTransform = trGrp; 
           //trGrp.Children.RemoveAt(1);//because Add function adds a new trGrp so its size increases and we do not need old trGrp so we remove them. 
           trGrp.Children.Remove(trRot); 
           label3.Content = angle.ToString(); 
          } 




         } 
         else if (temp[0] < zeroValue) 
         { 

          int totalValues = zeroValue - temp[0]; 
          if (totalValues==1) 
          { 
           totalValues = 0; 
          } 
          textBox3.Text = temp[0].ToString(); 
          angle = -totalValues * Properties.Settings.Default.angle; 

          if (angle> -21) 
          { 
           trRot.Angle = angle/2; 
          trGrp.Children.Add(trRot); 
          rectangle1.RenderTransform = trGrp; 
          trGrp.Children.Remove(trRot);//because Add function adds a new trGrp so its size increases and we do not need old trGrp so we remove them. 
          label3.Content = angle.ToString(); 
          } 




         } 

       } 
       catch (Exception) 
       { } 
      } 
    )); 
      this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, 
     new Action(
      delegate() 
      { 

       try 
       { 
        temp[1] = int.Parse(result[6].ToString() + result[7].ToString() + result[8].ToString() + result[9].ToString()); 
        if (temp[1] == zeroValue) 
        { 

         trRot1.Angle = 0; 
         trGrp.Children.Add(trRot1); 
         rectangle2.RenderTransform = trGrp1; 
         trGrp1.Children.RemoveAt(1);//because Add function adds a new trGrp so its size increases and we do not need old trGrp so we remove them. 
         // textBox3.Text = trRot.Angle.ToString(); 
         label4.Content = angle.ToString(); 

        } 

        else if (temp[1] > zeroValue) 
        { 

         int totalValues = temp[1] - zeroValue; 
         if (totalValues == 1) 
         { 
          totalValues = 0; 
         } 
         angle = totalValues * Properties.Settings.Default.angle; 
         angle = Math.Round(angle, 0); 
         if (angle < 21) 
         { 
          trRot1.Angle = angle/2; 
          trGrp1.Children.Add(trRot1); 
          rectangle2.RenderTransform = trGrp1; 
          trGrp1.Children.RemoveAt(0);//because Add function adds a new trGrp so its size increases and we do not need old trGrp so we remove them. 
          label4.Content = angle.ToString(); 
         } 
        } 
        else if (temp[1] < zeroValue) 
        { 

         int totalValues = zeroValue - temp[1]; 
         if (totalValues == 1) 
         { 
          totalValues = 0; 
         } 
         angle = -totalValues * Properties.Settings.Default.angle; 

         if (angle > -21) 
         { 
          trRot1.Angle = angle/2; 
          trGrp1.Children.Add(trRot1); 
          rectangle2.RenderTransform = trGrp1; 
          trGrp1.Children.RemoveAt(0);//because Add function adds a new trGrp so its size increases and we do not need old trGrp so we remove them. 
          label4.Content = angle.ToString(); 
         } 


        } 
       } 
       catch (Exception) 
       { 


       } 
      })); 


     } 

Я использовал здесь две функции Dispatcher.BeginInvok», потому что я хочу, чтобы повернуть оба объекта одновременно. Но проблема в том, что когда я использую только один объект для поворота, проблема не возникает. Но когда я включаю второй, первые объекты не вращаются правильно в соответствии с углом, указанным в моей программе. То, что я понимаю, что это проблема, что при каждом запуске события transformGroup добавляет новый rotateTransform. Поэтому я попытался удалить добавленный TrRot после добавления. Но это тоже не работает для меня. Спасибо.

+1

Почему вы не просто добавить анимацию в XAML? Кроме того, использование 'Dispatcher.Invoke' does * not * означает, что ваш код будет работать параллельно ... он просто добавляет ваши запросы в очередь потоков основного пользовательского интерфейса, точно так же, как если бы вы добавляли две анимации в XAML. – Sheridan

+0

Будет ли другой результат? Мне пришлось написать обработчик событий для полученных Serial Port, поэтому я написал его там. –

ответ

0

Вы можете добавить простой Trigger, чтобы начать анимацию в XAML ... допустим, вы добавили свойство bool с именем IsReady. Затем вы можете запустить анимацию, когда вы установите ее на true, и остановите ее, когда вы установите ее на false. Добавьте это Style в зависимости от того, объекты содержат RotateTransform объект, который должен быть анимированы:

<Style> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding IsReady}" Value="True"> 
      <DataTrigger.EnterActions> 
       <BeginStoryboard> 
        <Storyboard RepeatBehavior="Forever"> 
         <DoubleAnimation Storyboard.TargetProperty="RenderTransform. 
(RotateTransform.Angle)" From="0" To="359" Duration="0:0:1" /> 
        </Storyboard> 
       </BeginStoryboard> 
      </DataTrigger.EnterActions> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
Смежные вопросы