代码之家  ›  专栏  ›  技术社区  ›  Chris

尺度转换非线性

  •  0
  • Chris  · 技术社区  · 14 年前

    我使用缩放转换允许用户调整控件的大小。不过,当您开始移动鼠标时,控件会跳到一个新的大小,然后奇怪地缩放。从起始位置移动鼠标的距离越远,大小的增加就越大。

    我希望它是我计算要应用的比例的方式。代码如下:

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

    更新:现在使用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>
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   Jakob Christensen    14 年前

    为什么不使用ResizeContainer.renderTransFrom而不是ResizeContainer.layoutTransform?即使用

    ResizeContainer.LayoutTransform = scale;
    

    如果你想让比例是线性的,我想你应该用

    double scaler = 1 - diff / ResizeContainer.ActualWidth;
    

    编辑:

    代码中存在一个错误,如果您尝试多次调整大小,则会导致缩放控件的大小“跳转”。我建议您执行以下操作:

    将renderTransform添加到ResizeContainer网格:

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

    将mousemove事件处理程序中的代码更改为以下代码:

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

    通过这种方式,您可以通过拖动鼠标时移动的任何一小部分来更改比例。网格中的所有子控件也应进行缩放。