限制平移越界

时间:2014-11-28 08:53:34

标签: c# wpf xaml wpf-controls

当鼠标指针离开边框时,如何限制画布的平移..我的平移代码如下:

private Point origin;
private Point start;

void Path_MouseMove(object sender, MouseEventArgs e)
{

    if (rBtnPanning.IsChecked.Value)
    {

        if (!((Path)sender).IsMouseCaptured) return;
        Point p = e.MouseDevice.GetPosition(clipBorder);

        Matrix m = CanvasPanel.RenderTransform.Value;
        m.OffsetX = origin.X + (p.X - start.X);
        m.OffsetY = origin.Y + (p.Y - start.Y);

        CanvasPanel.RenderTransform = new MatrixTransform(m);
    }
}

void path_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if (((Path)sender).IsMouseCaptured) return;
    ((Path)sender).CaptureMouse();

    start = e.GetPosition(clipBorder);
    origin.X = CanvasPanel.RenderTransform.Value.OffsetX;
    origin.Y = CanvasPanel.RenderTransform.Value.OffsetY;
}

void path_MouseLeftBtnUp(object sender, MouseButtonEventArgs e)
{
    ((Path)sender).ReleaseMouseCapture();
}

下面添加了Xaml代码: 因为它有边界之间的画布。我需要限制平移,当我按住MouseLeftDown并拖出边界时它不应该移动。

<Window x:Class="DummyTestWPF.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="1000" Width="1000" Background="Bisque">
<Grid  Height="1000" Width="1000" x:Name="grid">

    <Border x:Name="clipBorder" Height="810" Width="810" BorderThickness="2" BorderBrush="Black" ClipToBounds="True">

    <Canvas x:Name="CanvasPanel" Height="800" Width="800" Background="Transparent" >
        </Canvas>

    </Border>
    <Grid>
        <Button Content="Original Size" Height="23" Name="btn_Original" Width="75" Click="btn_Original_Click" Margin="4,4,921,973" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="4,59,0,0" Name="txtNoOfZones" VerticalAlignment="Top" Width="120" MaxLength="2" PreviewTextInput="txtNoOfZones_PreviewTextInput" />
        <Label Content="Enter a number below for No. of Zones" Height="28" HorizontalAlignment="Left" Margin="4,33,0,0" Name="label1" VerticalAlignment="Top" Width="220" FontFamily="Vijaya" FontSize="15" FontWeight="Bold" FontStyle="Normal" />
        <Button Content="Zones" Height="23" HorizontalAlignment="Left" Margin="130,58,0,0" Name="btnNoOfZones" VerticalAlignment="Top" Width="41" Click="btnNoOfZones_Click" />
    </Grid>
</Grid>

请任何人建议我。

此致

Viswa。

2 个答案:

答案 0 :(得分:0)

只需在代码隐藏代码中的MouseMove事件中应用矩阵变换之前添加if条件。代码如下:

void Pan_MouseMove(object sender, MouseEventArgs e)
    {

        if (!((Path)sender).IsMouseCaptured) return;
        Point p = e.MouseDevice.GetPosition(clipBorder);

        if (p.X > 0 && p.Y > 0 && p.X < clipBorder.ActualWidth && p.Y < clipBorder.ActualHeight)
        {
            Matrix m = CanvasPanel.RenderTransform.Value;
            m.OffsetX = origin.X + (p.X - start.X);
            m.OffsetY = origin.Y + (p.Y - start.Y);
            CanvasPanel.RenderTransform = new MatrixTransform(m);
        }
    }

此致

Viswa

答案 1 :(得分:0)

可以使用以下公式找到图像的x边框:

let width = image.width;

borderX = Math.ceil(((width * this.currentScale) - width) / (2 * this.currentScale) );