Как плавно перетащить графическое окно в WPF? - PullRequest
0 голосов
/ 26 января 2011

Я работаю с WPF 4 и VB.net 2010. Мой проект состоит из полноэкранных окон с сеткой 640x480 в центре.

В этом проекте я хочу иметь различные блоки изображений (который будет иметь элемент .png изображений в них), который пользователь может перетаскивать в разных местах сетки.

По сути, мне нужно иметь возможность сделать так, чтобы элемент можно было щелкать и перетаскивать по сетке, при этом поле изображения все еще было видно и того же размера, что и пользователь, перемещающий его.Он никогда не должен быть в состоянии покинуть сетку.Мне также нужно иметь возможность определить, находится ли объект над другим объектом, поэтому, когда кнопка мыши отпущена, перетаскиваемый объект «отбрасывается» и запускает определенный блок кода.

Как мнесделать это?

1 Ответ

0 голосов
/ 26 января 2011

Что-то похожее на ваш «проект», но с использованием C #

С http://pastie.org/1498237

// XAML

<Window x:Class="MyProject.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="500" Width="500">
    <Grid>
        <Canvas x:Name="mycanv">
            <Image Width="150" x:Name="myimg" Source="some_source.png"/>
        </Canvas>
    </Grid>
</Window>

//C#

private Point mouseClick;
private double canvasLeft;
private double canvasTop;
public Window1()
{
    InitializeComponent();
    foreach (object obj in mycanv.Children)
    {
        try
        {
            Image img = (Image)obj;
            img.PreviewMouseDown += new MouseButtonEventHandler(myimg_MouseDown);
            img.PreviewMouseMove += new MouseEventHandler(myimg_MouseMove);
            img.PreviewMouseUp += new MouseButtonEventHandler(myimg_MouseUp);
            img.TextInput += new TextCompositionEventHandler(myimg_TextInput);
            img.LostMouseCapture += new MouseEventHandler(myimg_LostMouseCapture);
            img.SetValue(Canvas.LeftProperty, 0.0);
            img.SetValue(Canvas.TopProperty, 0.0);
        }
        catch
        {
            //do something
        }
    }
}

void myimg_LostMouseCapture(object sender, MouseEventArgs e)
{
    ((Image)sender).ReleaseMouseCapture();
}

void myimg_TextInput(object sender, TextCompositionEventArgs e)
{
    ((Image)sender).ReleaseMouseCapture();
}

void myimg_MouseUp(object sender, MouseButtonEventArgs e)
{
    ((Image)sender).ReleaseMouseCapture();
}

void myimg_MouseMove(object sender, MouseEventArgs e)
{
    if (((Image)sender).IsMouseCaptured)
    {
        Point mouseCurrent = e.GetPosition(null);
        double Left = mouseCurrent.X - canvasLeft;
        double Top = mouseCurrent.Y - canvasTop;
        ((Image)sender).SetValue(Canvas.LeftProperty, canvasLeft + Left);
        ((Image)sender).SetValue(Canvas.TopProperty, canvasTop + Top);
        canvasLeft = Canvas.GetLeft(((Image)sender));
        canvasTop = Canvas.GetTop(((Image)sender));
    }
}

void myimg_MouseDown(object sender, MouseButtonEventArgs e)
{
    mouseClick = e.GetPosition(null);
    canvasLeft = Canvas.GetLeft(((Image)sender));
    canvasTop = Canvas.GetTop(((Image)sender));
    ((Image)sender).CaptureMouse();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...