Silverlight 3 - ScaleTransform أو طريقة أخرى لتكبير اللوحة القماشية؟

StackOverflow https://stackoverflow.com/questions/1030367

سؤال

أحتاج إلى أن أكون قادرًا على تكبير وتصغير اللوحة القماشية باستخدام عجلة الماوس.لقد قمت بإعداد معالجات عجلة الماوس بنجاح وأستخدم حاليًا ScaleTransform لتطبيق التكبير/التصغير؛ومع ذلك، لا يتم القياس بطريقة "بديهية".

أحاول تنفيذ نفس أسلوب "التكبير/التصغير" كما ترون في MultiScaleImage، أو Google Maps/Earth، أو Adobe Acrobat Reader - ولكن ليس باستخدام صورة، بل باستخدام عنصر تحكم.لا يلزم أن يكون الانتقال "سلسًا" أو متحركًا (ما لم يكن أسلوبًا أسهل)، ولكن يجب أن تكون الوظيفة هي نفسها.

أي أفكار أو أفكار سيكون موضع تقدير كبير وشكرا مقدما!

يحرر:لقد تمكنت من "سلاسة" التكبير/التصغير باستخدام الرسوم المتحركة:

<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 حيث يكون التكبير "حول" الماوس.

هل كانت مفيدة؟

المحلول

تحتاج إلى استخدام المتوسط ​​المرجح كمركز تكبير/تصغير استنادًا إلى موضع الماوس.بمعنى آخر، احتفظ بمركز التكبير/التصغير الأخير (أو إذا لم يكن لديك مركزًا بعد، فما عليك سوى ضبطه على موضع الماوس الحالي) واحتفظ بعدد المرات التي تم فيها حساب مركز التكبير/التصغير (بعد التكبير/التصغير الأول، سيكون ذلك 1) .في كل مرة تقوم فيها بإعادة حساب مركز التكبير/التصغير، قم بزيادة هذا المتغير.

يتبع رمز المثال - deltaZoom هو مقدار التكبير/التصغير، وcenterX وcenterY هما مركز التكبير/التصغير الحالي، وZoomSteps هو عدد المرات التي قمنا فيها بالتكبير/التصغير، وmouseX وmouseY هما موضع الماوس الحالي:

_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 ولكن لا تزال هناك بعض المشكلات (ZoomStep = -1 أو 0 أو 1 يسبب أحيانًا اهتزازات غريبة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top