0

Windows 8 XAML でアナログ ダイヤルを実装しましたが、ほとんど機能します。

ただ、ダイヤルを回すとガタガタと揺れます。動かしながら時計回りと反時計回りにほぼ90度回転しているように見えます。PointerPressedを使用しPointerReleasedて実装しました。PointerMoved

マイコード

private void dial_PointerPressed(object sender, PointerRoutedEventArgs e)
{
    dialPressed = true;    
}

private void dial_PointerReleased(object sender, PointerRoutedEventArgs e)
{
    dialPressed = false;
}

private void dial_PointerMoved(object sender, PointerRoutedEventArgs e)
{
    if(dialPressed)
    {
        Windows.UI.Input.PointerPoint currentLocation = 
              e.GetCurrentPoint(dial); 

        Point dialCenter = 
              new Point(dial.ActualHeight / 2, dial.ActualWidth / 2);

        double radians = Math.Atan(
              (currentLocation.Position.Y - dialCenter.Y) / 
              (currentLocation.Position.X - dialCenter.X));

        RotateTransform r = new RotateTransform();
        r.Angle = radians * 180 / Math.PI;

        if (currentLocation.Position.X - dialCenter.X < 0)
        {
            r.Angle += 180;
        }

        TransformGroup t = new TransformGroup();
        t.Children.Add(r);
        dial.RenderTransform = t;

    }
}

さまざまなイベントに対してバインドする必要がありますか? ダイヤルが揺れている原因は何ですか?

4

1 に答える 1

1

わかりました、私は私の問題を解決しました。

コードは WPF の例からのもので、Windows 8 ではいくつかの点が異なります! これが私のために働いたものです。

if (dialPressed)
{

  // Get the current mouse position relative to the dial
  // I was doing this relative to the dial that was turning, which is wrong. 
  // The position of the pointer relative to the dial will change as the dial turns!
  // I created a static dial behind it, the same dimensions
  Windows.UI.Input.PointerPoint currentLocation = 
                                e.GetCurrentPoint(this.dial_Static); 

  Point dialCenter = 
        new Point(this.dial.ActualHeight / 2, this.dial.ActualWidth / 2);

  // Calculate an angle
  double radians = Math.Atan((currentLocation.Position.Y - dialCenter.Y) /                           
                             (currentLocation.Position.X - dialCenter.X));

  // in order to get these figures to work, I actually had to *add* 90 degrees to it,     
  // and *subtract* 180 from it if the X coord is negative. 
  double x = (radians * 180 / Math.PI) + 90;
  if ((currentLocation.Position.X - dialCenter.X) < 0)
  {
     x = x - 180;
  }

  RotateTransform r = new RotateTransform();
  r.Angle = x;

  TransformGroup t = new TransformGroup();
  t.Children.Add(r);
  dial.RenderTransform = t;

}

このコードをもっときれいに書くことができることはわかっていますが、変更点を示すために、上記のバージョンにできるだけ近づけるようにしています。

于 2012-11-07T11:44:09.403 に答える