Доступ к подклассу FrameworkElement из VisualTreeHelper.HitTest

У меня есть собственный класс элементов, который является подклассом FrameworkElement.

public class MyCustomElement : FrameworkElement
{
    private VisualCollection children;

    public MyCustomElement()
    {
        this.children = new VisualCollection(this);
        this.children.Add(MyDrawingRoutines());
    }

    private DrawingVisual MyDrawingRoutines()
    {
        //...
    }

    protected override int VisualChildrenCount
    {
        get { return children.Count; }
    }

    protected override Visual GetVisualChild(int index)
    {
        if (index < 0 || index >= children.Count)
        {
            throw new ArgumentOutOfRangeException();
        }

        return children[index];
    }
}

Пользовательский интерфейс содержит холст, на который добавляются эти настраиваемые элементы рисования и выполняется проверка попадания.

public partial class MainWindow : Window
{
        private MyCustomElement myCustomElement;

        public MainWindow()
        {
            InitializeComponent();

            myCustomElement = new MyCustomElement();
            myCanvas.Children.Add(myCustomElement);
        }

        private void myCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            System.Windows.Point pt = e.GetPosition((UIElement)sender);
            VisualTreeHelper.HitTest(this, null, new HitTestResultCallback(leftClickCallback), new PointHitTestParameters(pt));
        }

        public HitTestResultBehavior leftClickCallback(HitTestResult result)
        {
            if (result.VisualHit.GetType() == typeof(DrawingVisual))
            {
                if (((DrawingVisual)result.VisualHit).Opacity == 1.0)
                {
                    ((DrawingVisual)result.VisualHit).Opacity = 0.4;
                }
                else
                {
                    ((DrawingVisual)result.VisualHit).Opacity = 1.0;
                }
            }

            return HitTestResultBehavior.Stop;
        }

    }
}

Этот код работает должным образом, но я не могу найти способ определить, какому MyCustomElement принадлежит обнаруженный DrawingVisual. Сейчас корректировка непрозрачности сделана только внешне правильно? Я хотел бы изменить свойство непрозрачности MyCustomElement, применить его к методу MyDrawingRoutines() и иметь только готовый объект DrawingVisual, отрисованный на холсте.


person Noren    schedule 26.01.2013    source источник


Ответы (1)


Вы должны иметь возможность преобразовать родителя свойства DrawingVisual к вашему классу MyCustomElement:

public HitTestResultBehavior leftClickCallback(HitTestResult result)
{
    var visual = result.VisualHit as DrawingVisual;

    if (visual != null)
    {
        var element = visual.Parent as MyCustomElement;

        if (element != null)
        {
            if (element.Opacity == 1.0)
            {
                element.Opacity = 0.4;
            }
            else
            {
                element.Opacity = 1.0;
            }
        }
    }

    return HitTestResultBehavior.Stop;
}

Если вам нужно получить родителя любого визуального элемента (а не только ContainerVisual, у которого есть свойство Parent, как показано выше), вы можете использовать VisualTreeHelper.GetParent:

var visual = result.VisualHit;
var element = VisualTreeHelper.GetParent(visual) as MyCustomElement;
person Clemens    schedule 26.01.2013
comment
Большое Вам спасибо. Это именно то поведение, которое я искал. - person Noren; 26.01.2013