WPF реализует выбор типа резиновой ленты в списке

Я пытаюсь разрешить выбор типа резиновой ленты или лассо элементов в списке, которые пользователь хочет выбрать. Мой список находится в сетке, и к сетке я добавил элемент управления, который рисует прямоугольник над областью, которую я хочу выделить. Я попытался провести тестирование элементов списка, чтобы увидеть, попадают ли они в прямоугольник, но, похоже, все они возвращают то, что нет. При просмотре VisualTreeHelper.GetDescendantBounds для этих элементов (как я делаю для прямоугольника, чтобы получить его X,Y), он всегда возвращает X, Y как 0,0 для каждого из элементов. Что я делаю не так с тестированием?

1 ответ

Вы можете использовать этот код для получения позиции и границ элементов UIElement относительно другого элемента UIElement. Код взят из этого поста.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

public static class UIHelper
{
    public static Boolean GetUIElementCornersRelativTo(UIElement Base,
                                                UIElement RelativeTo,
                                                ref Point TopLeft,
                                                ref Point BottomLeft,
                                                ref Point BottomRight,
                                                ref Point TopRight,
                                                ref String Message)
    {
        try
        {
            if (Base == null)
            {
                throw new Exception("Base UIElement is null");
            }
            if (RelativeTo == null)
            {
                throw new Exception("RelativTo UIElement is null");
            }

            TopLeft = Base.TranslatePoint(new Point(0, 0), RelativeTo);
            BottomLeft = Base.TranslatePoint(new Point(0, Base.RenderSize.Height), RelativeTo);
            BottomRight = Base.TranslatePoint(new Point(Base.RenderSize.Width, Base.RenderSize.Height), RelativeTo);
            TopRight = Base.TranslatePoint(new Point(Base.RenderSize.Width, 0), RelativeTo);

            Message = "OK";
            return true;
        }
        catch (Exception ex)
        {
            Message = ex.Message;
            return false;
        }
    }
    public static Boolean GetPointRelativTo(UIElement Base,
                                     UIElement RelativeTo,
                                     Point ToProjectPoint,
                                     ref Point Result,
                                     ref String Message)
    {
        try
        {
            if (Base == null)
            {
                throw new Exception("Base UIElement is null");
            }
            if (RelativeTo == null)
            {
                throw new Exception("RelativTo UIElement is null");
            }

            if (ToProjectPoint == null)
            {
                throw new Exception("To project point is null");
            }

            Result = Base.TranslatePoint(ToProjectPoint, RelativeTo);

            Message = "OK";
            return true;
        }
        catch (Exception ex)
        {
            Message = ex.Message;
            return false;
        }
    }
}
Другие вопросы по тегам