1

キャンバス上にさまざまな量の子要素があるキャンバスがあります。ドラッグ アンド ムーブ機能を作成していますが、どの子も移動していません。

if (blockClicked == false && canvasClicked == true)
{
     if (isDrag == true)
     {
         double deltaV = e.GetPosition(null).Y - pot.Y;   
         double deltaH = e.GetPosition(null).X - pot.X;

         double newTop = deltaV + (double)canv.GetValue(Canvas.TopProperty);
         double newLeft = deltaH + (double)canv.GetValue(Canvas.LeftProperty);

         Console.WriteLine("newTop: " + newTop);
         Console.WriteLine("newLeft: " + newLeft);

         this.canv.SetValue(Canvas.TopProperty, newTop);
         this.canv.SetValue(Canvas.LeftProperty, newLeft);

         Console.WriteLine("canv new top: " + canv.GetValue(Canvas.TopProperty));
         Console.WriteLine("canv new left: " + canv.GetValue(Canvas.LeftProperty));
    }
}

上記は私が使用しているコードです。外側の if ステートメントはフラグをチェックしているだけですが、内側の IF ステートメントは、マウスがドラッグされていると判断している場所です。マウス (ポット) のポイントを取得し、その移動量を測定し、キャンバスの値をその測定値に設定します。

ただし、キャンバス上の子要素はどれも移動しませんか? 誰かが私にこれがなぜなのか説明できますか?

 <Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Name="canv" 
    ClipToBounds="False" 
    d:DesignHeight="0" d:DesignWidth="1180">

        <Canvas.RenderTransform>
            <ScaleTransform x:Name="scale"/>
        </Canvas.RenderTransform>

        <!--<Canvas x:Name="canv" Width="1000" Height="750" Canvas.Left="0" Canvas.Top="0">-->
        <Rectangle x:Name="Rectangle" 
               Width="1180" Height="784" Stretch="Fill"
               ClipToBounds="False">
            <Rectangle.Fill>
                <RadialGradientBrush RadiusX="0.763909" RadiusY="0.611915" Center="0.496313,0.50023" GradientOrigin="0.496313,0.50023">
                    <RadialGradientBrush.GradientStops>
                        <GradientStop Color="#00456487" Offset="0.489691" />
                        <GradientStop Color="#B3456487" Offset="0.90404" />
                    </RadialGradientBrush.GradientStops>
                    <RadialGradientBrush.RelativeTransform>
                        <TransformGroup />
                    </RadialGradientBrush.RelativeTransform>
                </RadialGradientBrush>
            </Rectangle.Fill>
        </Rectangle>
    </Canvas>

編集: 上記は、「canv」キャンバスに含まれる XAML です。

ピーター

4

3 に答える 3

2

まず、これを使用して位置を取得します。

double deltaV = e.GetPosition(parentofcanvas).Y-pot.Y;
double deltaH = e.GetPosition(parentofcanvas).X --pot.X;

次に、Canvas.SetTop(..)、Canvas.SetLeft(..)を使用しますが、CanvasがCanvasにない場合は、そのMarginプロパティを使用する必要があります。

于 2012-07-26T13:07:24.943 に答える
2

を設定するCanvas.Topには、 を呼び出しCanvas.SetTop(child, top)、同様に を呼び出しますLeft

これは静的メソッドであり、 ではないことに注意してCanvas.SetTopくださいthis.canv.SetTop

于 2012-07-26T13:04:23.383 に答える
1

私のコードを試してください: XAML - 四角形

<Rectangle x:Name="Rectangle" MouseDown="rectangle1_MouseDown" MouseUp="Rectangle_MouseUp"
               Width="122" Height="78" Stretch="Fill"
               ClipToBounds="False" Canvas.Left="19" Canvas.Top="19">
                <Rectangle.Fill>
                    <RadialGradientBrush RadiusX="0.763909" RadiusY="0.611915" Center="0.496313,0.50023" GradientOrigin="0.496313,0.50023">
                        <RadialGradientBrush.GradientStops>
                            <GradientStop Color="#00456487" Offset="0.489691" />
                            <GradientStop Color="#B3456487" Offset="0.90404" />
                        </RadialGradientBrush.GradientStops>
                        <RadialGradientBrush.RelativeTransform>
                            <TransformGroup />
                        </RadialGradientBrush.RelativeTransform>
                    </RadialGradientBrush>
                </Rectangle.Fill>
            </Rectangle>

C#:

 public MainWindow()
    {
        InitializeComponent();
        DispatcherTimer dt = new DispatcherTimer();
        dt.Tick += new EventHandler(dt_Tick);
        dt.Start();
    }

    void dt_Tick(object sender, EventArgs e)
    {
        if (pressed == true)
        {
            Point c = Mouse.GetPosition(canvas1);
            Point c1 = Mouse.GetPosition(Rectangle);

            Canvas.SetLeft(Rectangle, c.X - c1.X);
            Canvas.SetTop(Rectangle, c.Y - c1.Y);
        }
    }
    bool pressed = false;
    private void rectangle1_MouseDown(object sender, MouseButtonEventArgs e)
    {
        pressed = true;
    }

    private void Rectangle_MouseUp(object sender, MouseButtonEventArgs e)
    {
        pressed = false;
    }
于 2012-07-26T13:21:22.943 に答える