Как я могу остановить пересечение движущегося пользовательского элемента управления с другими пользовательскими элементами управления того же типа? - PullRequest
0 голосов
/ 09 декабря 2018

Привет :) Я работаю в WPF, главное окно - холст.Я создал пользовательский элемент управления Страна , который можно перемещать по главному окну с помощью мыши:

public partial class Country : UserControl
{
    private Point position = new Point(0, 0);
    private Point mousePosition = new Point(0, 0);
    protected Boolean isDragging;
    private Double prevX, prevY;
    public static List<Country> list = new List<Country>();
    public static int num = 1;
    private string riddle;

    public Country()
    {
        InitializeComponent();
        this.Height = 100;
        this.Width = 100;
        this.Background = Brushes.Red;
        this.Content = "country" + num;
        num++;
        position = new Point(Canvas.GetLeft(this), Canvas.GetTop(this));
        this.MouseLeftButtonDown += new MouseButtonEventHandler(Control_MouseLeftButtonDown);
        this.MouseLeftButtonUp += new MouseButtonEventHandler(Control_MouseLeftButtonUp);
        this.MouseMove += new MouseEventHandler(Control_MouseMove);
        list.Add(this);
    }

    private void Control_MouseLeftButtonDown(Object sender, MouseButtonEventArgs e)
    {
        isDragging = true;
        var draggableControl = (sender as UserControl);
        mousePosition = e.GetPosition(Parent as UIElement);
        draggableControl.CaptureMouse();
    }

    private void Control_MouseLeftButtonUp(Object sender, MouseButtonEventArgs e)
    {
        isDragging = false;
        var draggable = (sender as UserControl);
        var transform = (draggable.RenderTransform as TranslateTransform);
        if (transform != null)
        {
            prevX = transform.X;
            prevY = transform.Y;
        }
        draggable.ReleaseMouseCapture();
    }

    private void Control_MouseMove(Object sender, MouseEventArgs e)
    {
                var draggableControl = (sender as UserControl);
                if (isDragging && draggableControl != null)
                {
                    var currentPosition = e.GetPosition(Parent as UIElement);
                    var transform = (draggableControl.RenderTransform as TranslateTransform);
                    if (transform == null)
                    {
                        transform = new TranslateTransform();
                        draggableControl.RenderTransform = transform;
                    }
                    double aX = transform.X;
                    double aY = transform.Y;
                    transform.X = (currentPosition.X - mousePosition.X);
                    transform.Y = (currentPosition.Y - mousePosition.Y);
                    if (prevX > 0)
                    {
                        transform.X += prevX;
                        transform.Y += prevY;
                    }
                }
            }
        }

Это код xaml:

<UserControl x:Class="WpfApplication7.Country"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:WpfApplication7"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid Width="100" Height="100" Background="Red">

</Grid>
</UserControl>

Я пытался предотвратить пересечение экземпляров страны друг с другом, то есть - если у меня есть несколько стран в главном окне, и я перемещаю страну, и она собирается пересекаться с другой странойтогда движущаяся страна остановится, или вернется, или что-то в этом роде.К сожалению, все идеи, которые я имел в виду, провалились.Должен ли я сделать что-то в MainWindow, возможно?Я был бы очень рад, если кто-то может предложить решение или понимание этого.

Помощь будет высоко ценится

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Добавление общедоступной прямоугольной переменной в страну.При добавлении их на холст добавить в список в главном окне.Ручка PreviewMousemove и т. Д. На холсте, чтобы переместить их.При перетаскивании обновите прямоугольник, используя текущую верхнюю и левую сторону, фактическую высоту и ширину.Переберите свой список стран.Используйте rect.intersectsWith, чтобы увидеть, будут ли они перекрываться в новой позиции.Если это так, прекратите перетаскивание и не перемещайте элемент управления.

0 голосов
/ 09 декабря 2018

С точки зрения пользователя, лучшее решение - не прекратить наркотики, а просто указать пользователю, что эта операция не может быть выполнена.Я бы предложил что-то вроде смены курсора (например, в стандартных приложениях для перетаскивания в Windows) или изменения цвета для объектов, находящихся под вашим наркотиком (этот подход используется в некоторых играх) или для них обоих.

Я думаю, у вас должно быть событие в вашем классе Country и соответствующий обработчик событий в главном окне.Таким образом, вы можете отследить движение любой страны и легко реагировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...