简体   繁体   English

Scaletransform文本块

[英]Scaletransform textblock

I'm adding to the canvas a textblock that the user can bring everywhere but now I'm stuck trying to figure out how to make textblock able to be enlarged or rotated pinching it, this is my code so far: 我在画布上添加了一个文本块,用户可以将其带到任何地方,但是现在我一直试图找出如何使文本块能够放大或旋转捏住的方法,到目前为止,这是我的代码:

//create the textblock 
TextBlock txt = new TextBlock() { Text = UserString, FontSize = 56 };

//Adding gesture listener here
GestureListener TextGestureListener = GestureService.GetGestureListener(txt);
txt.MouseEnter += txt_MouseEnter;
TextGestureListener.DragStarted += new EventHandler<DragStartedGestureEventArgs>(GestureListener_DragStarted);
TextGestureListener.DragDelta += new EventHandler<DragDeltaGestureEventArgs>(GestureListener_DragDelta);
TextGestureListener.DragCompleted += new EventHandler<DragCompletedGestureEventArgs>(GestureListener_DragCompleted);
TextGestureListener.PinchDelta += new EventHandler<PinchGestureEventArgs>(GestureListener_PinchDelta);
WholePicture.Children.Add(txt);

//pinch to zoom or at least try!
void GestureListener_PinchDelta(object sender, PinchGestureEventArgs e)
{
    TextBlock txt = (TextBlock)sender;
    Scale = (ScaleTransform)txt.RenderTransform;
    Scale.ScaleX = e.DistanceRatio;
    Scale.ScaleY = e.DistanceRatio;
}

Now, if I try to enlarge the textblock it simply crash with this errors 现在,如果我尝试放大文本块,则会因该错误而崩溃

       $exception   {System.InvalidCastException: Unable to cast object of type 'System.Windows.Media.TranslateTransform' to type 'System.Windows.Media.ScaleTransform'.
       at CrazyFill.Pages.CrazyFillCore.GestureListener_PinchDelta(Object sender, PinchGestureEventArgs e)
       at Microsoft.Phone.Controls.SafeRaise.Raise[T](EventHandler`1 eventToRaise, Object sender, GetEventArgs`1 getEventArgs)
       at Microsoft.Phone.Controls.GestureListener.RaiseGestureEvent[T](Func`2 eventGetter, Func`1 argsGetter, Boolean releaseMouseCapture)
       at Microsoft.Phone.Controls.GestureListener.ProcessTouchPanelEvents()
       at Microsoft.Phone.Controls.GestureListener.TouchDelta()
       at Microsoft.Phone.Controls.GestureListener.OnTouchFrameReported(Object sender, TouchFrameEventArgs e)
       at System.Windows.Input.Touch.OnTouch(Object sender, TouchFrameEventArgs e)
       at MS.Internal.JoltHelper.RaiseEvent(IntPtr target, UInt32 eventId, IntPtr coreEventArgs, UInt32 eventArgsTypeIndex)}    System.Exception {System.InvalidCastException}

I think you have a bug because you overwrite the rendertransform of your textblock with a new transform. 我认为您有一个错误,因为您用新的转换覆盖了文本块的rendertransform。 The older one the translatex-y will be lost that way. 较旧的translatex-y将会丢失。 You could use CompositeTransform to that and just set scaletransform too on it. 您可以对此使用CompositeTransform,也可以对其设置scaletransform。

In that cases I would use Databinding not just manipulating from code-behind. 在那种情况下,我将使用数据绑定,而不仅仅是从后台代码进行操作。

    <TextBox Text="This will move" Height="80" Width="200" x:Name="ToMoveTextBox" RenderTransformOrigin="0.5,0.5">
        <TextBox.RenderTransform>
            <CompositeTransform ScaleX="{Binding ScaleXY}" ScaleY="{Binding ScaleXY}" 
                                TranslateX="{Binding TranslateX}" TranslateY="{Binding TranslateY}"/>
        </TextBox.RenderTransform>
        <toolkit:GestureService.GestureListener>
            <toolkit:GestureListener DragDelta="GestureListener_DragDelta" PinchDelta="GestureListener_PinchDelta"/>
        </toolkit:GestureService.GestureListener>
    </TextBox>

In my sample I used code-behind to calculate the values but in other way you could do it from ViewModel too with CallMethodAction (It is a UI manipulation so you can choose.) 在我的示例中,我使用了代码隐藏来计算值,但通过其他方法,您也可以使用CallMethodAction从ViewModel中进行操作(这是一种UI操作,因此您可以选择。)

    private void GestureListener_DragDelta(object sender, DragDeltaGestureEventArgs e)
    {
        TranslateX += e.HorizontalChange;
        TranslateY += e.VerticalChange;
        e.Handled = true;
    }

    private void GestureListener_PinchDelta(object sender, PinchGestureEventArgs e)
    {
        ScaleXY = e.DistanceRatio;
        e.Handled = true;
    }

I hope it could help you. 希望对您有所帮助。

The GestureListener_PinchDelta was obviously wrong, here's the working one GestureListener_PinchDelta显然是错误的,这是可行的

void GestureListener_PinchDelta(object sender, PinchGestureEventArgs e)
{
        TextBlock ui = (TextBlock)sender;
        if (ui != null)
        {
            if (!(ui.RenderTransform is ScaleTransform))
                ui.RenderTransform = new ScaleTransform();

            ScaleTransform t = ui.RenderTransform as ScaleTransform;

            t.ScaleX = e.DistanceRatio;
            t.ScaleY = e.DistanceRatio;
            e.Handled = true;
        }
}

this just have a little bug and it's that when I start the gesture the textblock forgot about where it was placed by the user and return where it was firt created (top of the page), working for a solution and when foundi'll let you know 这只是一个小错误,就是当我开始手势时,文本块忘记了用户放置它的位置,并返回了它被创建的位置(页面顶部),正在寻求解决方案以及何时可以让您知道

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM