2

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}
4

2 回答 2

1

我认为您有一个错误,因为您用新的转换覆盖了文本块的渲染转换。translatex-y 的旧版本会以这种方式丢失。您可以使用 CompositeTransform 并在其上设置 scaletransform 。

在那种情况下,我会使用数据绑定,而不仅仅是从代码隐藏中进行操作。

    <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>

在我的示例中,我使用代码隐藏来计算值,但以其他方式,您也可以从 ViewModel 中使用CallMethodAction进行计算(这是一个 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;
    }

我希望它可以帮助你。

于 2013-02-03T09:56:16.097 回答
0

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;
        }
}

这只是有一个小错误,那就是当我开始手势时,文本块忘记了用户放置它的位置并返回它最初创建的位置(页面顶部),为解决方案工作,何时找到我会让你知道

于 2013-01-31T07:35:20.180 回答