2017-06-04 69 views
1

我想拖動滾動查看器內的形狀。 我的解決方案是在觸摸形狀時暫時禁用滾動查看器,然後在釋放時重新啓用。感覺有點冒險,但找不到更好的解決方案。有沒有人有更好的建議?在滾動查看器中拖動形狀與觸摸UWP

下面的XAML代碼。

<Page 
x:Class="testdragshape.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="using:testdragshape" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" Height="390.667"> 

<Grid> 
    <ScrollViewer Name="scrollViewer" > 
     <Grid Name="pageGrid"> 
      <TextBlock Name="log" Text="Position:"/> 
      <Canvas Name="myCanvas" Width="500" Height="500"> 
       <Rectangle Name="myTarget" Width="272" Height="272" Fill="Red" Canvas.Left="41" Canvas.Top="53" /> 
      </Canvas> 
     </Grid>    
    </ScrollViewer> 

</Grid> 

下面

using Windows.Foundation; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Input; 
using Windows.UI.Xaml.Media; 

namespace testdragshape 
{ 
    public sealed partial class MainPage : Page 
    { 
     public MainPage() 
     { 
      this.InitializeComponent(); 
      myCanvas.RenderTransform = new TranslateTransform(); 
      myTarget.PointerPressed += Target_PointerPressed; 
      myTarget.PointerMoved += Target_PointerMoved; 
      myTarget.PointerReleased += MyTarget_PointerReleased; 
     } 

     Point _drag0; 
     private void Target_PointerPressed(object sender, PointerRoutedEventArgs e) 
     { 
      // disable the scroll mode 
      scrollViewer.HorizontalScrollMode = ScrollMode.Disabled; 
      scrollViewer.VerticalScrollMode = ScrollMode.Disabled; 

      _drag0 = e.GetCurrentPoint(myCanvas).Position; 
      log.Text = "Position - X: " + _drag0.X + " Y: " + _drag0.Y; 
     } 

     private void Target_PointerMoved(object sender, PointerRoutedEventArgs e) 
     { 
      if (!e.Pointer.IsInContact) return; 

      var point = e.GetCurrentPoint(myCanvas).Position; 
      var t = new Point(point.X - _drag0.X, point.Y - _drag0.Y); 
      TranslateTransform previous = (TranslateTransform)myCanvas.RenderTransform; 
      myCanvas.RenderTransform = new TranslateTransform() 
      { 
       X = previous.X + t.X, 
       Y = previous.Y + t.Y 
      }; 

      log.Text = "Position - X: " + point.X + " Y: " + point.Y; 
     } 

     private void MyTarget_PointerReleased(object sender, PointerRoutedEventArgs e) 
     { 
      // re-enable scroll mode 
      scrollViewer.HorizontalScrollMode = ScrollMode.Auto; 
      scrollViewer.VerticalScrollMode = ScrollMode.Auto; 
     } 
    } 
} 

回答

1

的C#UWP代碼你就要成功了,除了你應該禁用的ScrollViewer的直接操作,而不是禁用滾動,並重新啓用它,一旦你完成。

private void OnPointerPressed(object sender, PointerRoutedEventArgs e) 
{ 
    scrollViewer.CancelDirectManipulations(); 
} 

private void OnPointerReleased(object sender, PointerRoutedEventArgs e) 
{ 
    TryStartDirectManipulation(e.Pointer); 
} 
+0

感謝您的建議。這適用於觸摸,但如果嘗試使用鼠標,TryStartDirectManipulation(e.Pointer)會給出錯誤System.ArgumentException:'值不在預期的範圍內。 – ClaudiaWey

+0

這是正確的,因爲直接操作是爲平滑的觸摸手勢而設計的。用鼠標你做的應該沒問題。 –

+1

@MartinZikmund,你的編輯是錯誤的。 'TryStartDirectManipulation'是一個* static *方法。 –