2010-08-23 9 views
5

का उपयोग करके मेरे आवेदन में एक बहुत ही सरल 'ड्रैग' तंत्र को लागू करने की मेरी खोज पर (जिसमें 'माता-पिता' कैनवास के अंदर घोंसले हुए कई कैनवास होते हैं) मैं निम्नलिखित बिट्स के साथ आया हूं कोड की: (अंतरिक्ष केवल प्रासंगिक बिट दिखा बचाने के लिए)डब्ल्यूपीएफ में ड्रैगगेबल कैनवास 'थंब'

MainWindow.xaml

<Canvas Name="parentCanvas" Background="#FFE8CACA"> 
     <Canvas Name="myCanvas" Height="100" Width="200" Background="#FFB4FFB4"> 
      <Thumb Name="myThumb" Canvas.Left="0" Canvas.Top="0" Background="Blue" Width="200" Height="20" DragDelta="onDragDelta" /> 
     </Canvas> 

     <!-- debug --> 
     <Button Content="Zero" Height="51" Name="button1" Width="46" Click="button1_Click" Canvas.Left="14" Canvas.Top="302" /> 
     <Label Name="pos" Width="499" Canvas.Left="77" Canvas.Top="302" Height="26" /> 
     <Label Name="changes" Height="28" Canvas.Left="77" Canvas.Top="325" Width="499" /> 
    </Canvas> 

MainWindow.xaml.cs

void onDragDelta(object sender, DragDeltaEventArgs e) 
    { 
     Canvas.SetLeft(myCanvas, e.HorizontalChange); 
     Canvas.SetTop(myCanvas, e.VerticalChange); 

     //debug info 
     pos.Content = "Left: " + Canvas.GetLeft(myCanvas) + ", Top: " + Canvas.GetTop(myCanvas); 
     changes.Content = "Horizontal: " + e.HorizontalChange + ", Vertical: " + e.VerticalChange; 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     Canvas.SetLeft(myCanvas, 0); 
     Canvas.SetTop(myCanvas, 0); 
    } 

जो काम करता है, यादृच्छिक रूप से! ऐसा लगता है कि माउस आंदोलनों का पालन करना है, लेकिन मुझे DragDeltaEventArgs की व्याख्या करने में समस्या हो रही है, जो कैनवास के बहुत अस्थिर आंदोलन का कारण बनती है। यह समझाना मुश्किल है कि यहां एक छोटा वीडियो है जिसे मैंने कैप्चर किया है: http://img84.imageshack.us/img84/6614/drag.mp4

कोई टिप्पणी/सुझाव बहुत सराहना की जाएगी क्योंकि मैं थोड़ी देर के लिए इस पर घूर रहा हूं और यह नहीं समझ सकता यह से कोई लेना देना :(

उत्तर

4

क्षैतिज और लम्बवत परिवर्तन राशि पिछले घटना के बाद से ले जाया गया है ताकि आप उन्हें वर्तमान स्थिति को जोड़ने की जरूरत है कर रहे हैं।

Canvas.SetLeft(myCanvas, Canvas.GetLeft(myCanvas) + e.HorizontalChange); 
Canvas.SetTop(myCanvas, Canvas.GetTop(myCanvas) + e.VerticalChange); 

तुम भी के लिए एक प्रारंभिक स्थिति निर्धारित करने की आवश्यकता कैनवास अन्यथा आपको NaN मिलता है।

<Canvas Name="myCanvas" Height="100" Width="200" Background="#FFB4FFB4" Canvas.Left="0" Canvas.Top="0"> 
+0

मुझे अब मिल गया है, स्पष्टीकरण के लिए बहुत बहुत धन्यवाद :) – Hamza

संबंधित मुद्दे