2009-06-23 12 views
11

मुझे mousewheel का उपयोग कर कैनवास से ज़ूम इन और आउट करने में सक्षम होना चाहिए। मैंने माउस व्हील हैंडलर सफलतापूर्वक स्थापित किए हैं और ज़ूम लागू करने के लिए वर्तमान में स्केलट्रांसफॉर्म का उपयोग कर रहा हूं; हालांकि, स्केलिंग "अंतर्ज्ञानी" तरीके से नहीं की जाती है।सिल्वरलाइट 3 - स्केलट्रांसफॉर्म या कैनवास में ज़ूम करने के लिए अन्य विधि?

मैं "ज़ूमिंग" की एक ही शैली को पूरा करने की कोशिश कर रहा हूं जैसा कि आप मल्टीस्केल इमेज, Google मैप्स/अर्थ, या एडोब एक्रोबैट रीडर में देख सकते हैं - लेकिन नियंत्रण के साथ किसी छवि के साथ नहीं। संक्रमण को "चिकनी" या एनिमेटेड होने की आवश्यकता नहीं है (जब तक कि यह एक आसान दृष्टिकोण न हो), लेकिन कार्यक्षमता एक जैसी होनी चाहिए।

किसी भी विचार या विचारों की अत्यधिक सराहना की जाएगी और अग्रिम धन्यवाद!

संपादित करें:

<Canvas.Resources> 
      <Storyboard x:Name="ZoomStoryboard"> 
       <DoubleAnimation x:Name="ZoomAnimationX" 
           Storyboard.TargetName="Workspace" 
           Storyboard.TargetProperty="Canvas.RenderTransform.ScaleTransform.ScaleX" 
           Duration="0:0:0.2"/> 
       <DoubleAnimation x:Name="ZoomAnimationY" 
           Storyboard.TargetName="Workspace" 
           Storyboard.TargetProperty="Canvas.RenderTransform.ScaleTransform.ScaleY" 
           Duration="0:0:0.2"/> 
      </Storyboard> 
     </Canvas.Resources> 
निम्न कोड के साथ

:: मैं करने के लिए "चिकनी" एनीमेशन का उपयोग कर ज़ूम प्रबंधित किया है

_Zoom += (args.Delta/7); 
if (_Zoom < 0.15) 
    _Zoom = 0.15; 
ZoomAnimationX.To = _Zoom; 
ZoomAnimationY.To = _Zoom; 
ZoomStoryboard.Begin(); 
ZoomScale.Text = _Zoom.ToString("0.00") + "x"; 
_PreviousMousePosition = _CurrentMousePosition 

हालांकि, समस्या अभी भी उठता है कि यह का ज़ूम है शीर्ष-बाएं कोने, Google मानचित्र जैसी साइटों के विपरीत जहां ज़ूम माउस के चारों ओर "आस-पास" है।

उत्तर

10

आपको माउस स्थिति के आधार पर ज़ूम केंद्र के रूप में भारित औसत का उपयोग करने की आवश्यकता है। दूसरे शब्दों में, नवीनतम ज़ूम केंद्र रखें (या यदि आपके पास अभी तक कोई नहीं है तो इसे अभी भी वर्तमान माउस स्थिति पर सेट करें) और ज़ूम केंद्र की गणना की गई संख्या को बनाए रखें (पहले ज़ूम के बाद, यह 1 होगा) । प्रत्येक बार जब आप ज़ूम केंद्र का पुनर्मूल्यांकन करते हैं, तो उस विविधता को बढ़ाएं।

उदाहरण कोड इस प्रकार - deltaZoom आप कितना जूमिंग रहे हैं, centerX और centerY वर्तमान ज़ूम केंद्र हैं, ZoomSteps हम ज़ूम इन कर लेते समय की संख्या है, और mouseX और कातर वर्तमान माउस स्थिति हैं:

_Zoom += deltaZoom; 
     if (_Zoom <= 0) 
      _Zoom = 0.1; 

     if (deltaZoom >= 0) 
     { 
      if (_ZoomSteps == -1) 
      { 
       _CenterX = 0; 
       _CenterY = 0; 
       _ZoomSteps = 0; 
      } 
      else 
      { 
       _CenterX = (_CenterX * Math.Abs(_ZoomSteps) + mouseX)/(Math.Abs(_ZoomSteps + 1)); 
       _CenterY = (_CenterY * Math.Abs(_ZoomSteps) + mouseY)/(Math.Abs(_ZoomSteps + 1)); 
       _ZoomSteps++; 
      } 
     } 
     else 
     { 
      if (_ZoomSteps == 1) 
      { 
       _CenterX = 0; 
       _CenterY = 0; 
       _ZoomSteps = 0; 
      } 
      else 
      { 
       _CenterX = (_CenterX * Math.Abs(_ZoomSteps) - mouseX)/(Math.Abs(_ZoomSteps - 1)); 
       _CenterY = (_CenterY * Math.Abs(_ZoomSteps) - mouseY)/(Math.Abs(_ZoomSteps - 1)); 
       _ZoomSteps--; 
      } 
     } 

     ZoomAnimationX.To = _Zoom; 
     ZoomAnimationY.To = _Zoom; 
     CenterAnimationX.To = Math.Abs(_CenterX); 
     CenterAnimationY.To = Math.Abs(_CenterY); 
     ZoomStoryboard.Begin(); 

संपादित किया गया ताकि आप 1.0 ज़ूम स्तर से नीचे गिर सकें लेकिन अभी भी कुछ समस्याएं हैं (ज़ूमस्टेप = -1, 0 या 1 कभी-कभी अजीब हिलाता है)।

+0

स्रोत के लिए धन्यवाद :) +1 –

+0

केंद्रएनीमेशन क्या है? – Erix

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