2010-06-08 79 views
0

我正在使用缩放变换来允许用户调整控件的大小。但是,当你开始移动鼠标时,控件会跳到一个新的大小,然后奇怪地缩放。您将鼠标从起始位置移动得越远,尺寸的增加就越大。ScaleTransform非线性变换

我期望它能够计算出应用的比例。下面是代码:

private void ResizeGrip_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    ResizeHandle.CaptureMouse(); 

    //Get the initial coordinate cursor location on the window 
    initBtmX = e.GetPosition(this).X; 

    bottomResize = true; 
} 

private void ResizeGrip_MouseUp(object sender, MouseButtonEventArgs e) 
{ 
    bottomResize = false; 
    ResizeHandle.ReleaseMouseCapture(); 
} 

private void ResizeGrip_MouseMove(object sender, MouseEventArgs e) 
{ 
    if(bottomResize == true) 
    { 
     //Get the new Y coordinate cursor location 
     double newBtmX = e.GetPosition(this).X; 


     //Get the smallest change between the initial and new cursor location 
     double diffX = initBtmX - newBtmX; 

     // Let our rectangle capture the mouse 
     ResizeHandle.CaptureMouse(); 

     double newWidth = e.GetPosition(this).X - diffX; 

     double scaler = newWidth/ResizeContainer.ActualWidth; 

     Console.WriteLine("newWidth: {0}, scalar: {1}", newWidth, scaler); 


     if (scaler < 0.75 || scaler > 3) 
      return; 

     ScaleTransform scale = new ScaleTransform(scaler, scaler); 

     ResizeContainer.LayoutTransform = scale; 
    } 
} 

更新:现在用你为什么不使用的,而不是ResizeContainer.LayoutTransform ResizeContainer.RenderTransfrom XAML

<wtk:IToolDialog x:Name="VideoPlayer" ParentControl="{Binding ElementName=Stage}" DialogTitle="Video Player" Margin="90,5,0,0"> 
    <Grid> 
     <Grid x:Name="ResizeContainer" ClipToBounds="True" Width="320" Height="240" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,1"> 
      <!-- The video frame --> 
      <Image Stretch="Fill" Source="{Binding CurrentFrameImage}" x:Name="VideoImage" /> 
      <Grid> 
       <pplcontrols:VideoGroundPlane Foreground="Black" GridSize="20" GroundPlane="{Binding GroundPlane}"> 
       </pplcontrols:VideoGroundPlane> 
      </Grid> 
      <Grid x:Name="HitMask" IsHitTestVisible="False"/> 
     </Grid> 
     <ResizeGrip Cursor="SizeNWSE" x:Name="ResizeHandle" VerticalAlignment="Bottom" HorizontalAlignment="Right" Mouse.MouseDown="ResizeGrip_MouseDown" Mouse.MouseUp="ResizeGrip_MouseUp" Mouse.MouseMove="ResizeGrip_MouseMove"></ResizeGrip> 
    </Grid> 
</wtk:IToolDialog> 
+0

其他控件放置在哪里?它们是否在您正在调整大小的用户控件中?你可以张贴更多的代码来澄清? – 2010-06-08 14:13:03

+0

我更新了我的代码。当你说儿童控制不能缩放时,我不确定你的意思。 :-) – 2010-06-08 16:25:45

回答

0

的原因吗?即使用

ResizeContainer.LayoutTransform = scale; 

如果你想规模是线性的,我认为你应该使用

double scaler = 1 - diff/ResizeContainer.ActualWidth; 

编辑:

存在这样使缩放的代码中的错误如果您尝试调整一次以上,则可以控制大小“跳跃”。我建议你做到以下几点:在你的MouseMove事件处理程序

<Grid.RenderTransform> 
    <ScaleTransform x:Name="transform" ScaleX="1" ScaleY="1" /> 
</Grid.RenderTransform> 

更改代码如下:

添加的RenderTransform您ResizeContainer电网

if (bottomResize) 
{ 
    double newBtmX = e.GetPosition(this).X; 
    double scaler = -(initBtmX - newBtmX)/grid1.ActualWidth; 
    initBtmX = newBtmX; 

    transform.ScaleX += scaler; 
    transform.ScaleY += scaler; 
} 

这样你改变鼠标在拖动时移动的量很小。网格内的所有子控件也应该缩放。

+0

我使用了LayoutTransform,因为我希望所有的孩子也可以调整大小,有没有一种方法可以很好地与RenderTransform做到这一点? – Chris 2010-06-08 13:14:52

+0

更新:我刚刚尝试RenderTransform与新的缩放器方程,它的工作完美...现在我需要的是其他控件与它一起扩展吗? – Chris 2010-06-08 13:19:14

+0

其他控件放置在哪里?它们是否在您正在调整大小的用户控件中?你可以张贴更多的代码来澄清? – 2010-06-08 13:33:51