Scaletransform textblock

时间:2013-01-29 21:42:46

标签: c# windows-phone-7 windows-phone-8

我在画布上添加了一个用户可以随处带来的文本块,但现在我不知道如何让文本块能够被放大或旋转捏它, 到目前为止,这是我的代码:

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

现在,如果我尝试放大文本块,它只会因此错误而崩溃

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

2 个答案:

答案 0 :(得分:1)

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

在这种情况下,我会使用Databinding而不仅仅是从代码隐藏中进行操作。

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

在我的示例中,我使用代码隐藏来计算值,但在其他方面,您也可以使用 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;
    }

我希望它可以帮到你。

答案 1 :(得分: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;
        }
}

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