1

私は次のように定義された装飾者を持っています:

    private class ErrorAdorner : Adorner
    {
        private readonly Border _errorBorder;

        public ErrorAdorner(UIElement adornedElement)
            : base(adornedElement)
        {
            _errorBorder = new Border();
            _errorBorder.BorderThickness = new Thickness(2);
            _errorBorder.BorderBrush = Brushes.Red;
            Image img = new Image();
            img.HorizontalAlignment = HorizontalAlignment.Right;
            img.VerticalAlignment = VerticalAlignment.Center;
            img.Stretch = Stretch.None;
            Binding imgBinding = new Binding
            {
                Source = adornedElement,
                Path = new PropertyPath(IconProperty)
            };
            img.SetBinding(Image.SourceProperty, imgBinding);
            Binding ttBinding = new Binding
            {
                Source = adornedElement,
                Path = new PropertyPath(ErrorMessageProperty)
            };
            img.SetBinding(ToolTipProperty, ttBinding);
            _errorBorder.Child = img;
        }

        protected override Size MeasureOverride(Size constraint)
        {
            AdornedElement.Measure(constraint);
            return AdornedElement.RenderSize;
        }

        protected override Size ArrangeOverride(Size finalSize)
        {
            _errorBorder.Arrange(new Rect(finalSize));
            return finalSize;
        }

        protected override Visual GetVisualChild(int index)
        {
            if (index == 0)
                return _errorBorder;
            throw new ArgumentOutOfRangeException("index");
        }

        protected override int VisualChildrenCount
        {
            get
            {
                return 1;
            }
        }
    }

ErrorMessageおよびIconは、囲んでいるクラス()で宣言された添付プロパティErrorProviderです。ErrorMessageプロパティがnull以外の値に設定されている場合、装飾は要素に追加されます。

私の問題は、装飾者が適切にレンダリングされてToolTipいるのに、マウスをその上に移動したときに画像上のが表示されないことです。拘束力のある問題ではないことはわかっています。Snoopを使用してコントロールを調べると、ToolTipプロパティに期待値があることがわかります。装飾でマウス関連のイベントを受信できないため、問題はヒットテストに関連していると思われますIsHitTestVisible...プロパティがtrueに設定されているため、イベントを受信しない理由がわかりません。

何か案が?

4

1 に答える 1

3

さて、これも以前に私を噛んだことがあります。独自のビジュアルツリーを定義する場合、ビジュアルの子を返すだけでは不十分です。また、それらを追加したことをWPFに通知する必要があります。コンストラクターの最後に、これを追加するだけです。

this.AddVisualChild(_errorBorder);
this.AddLogicalChild(_errorBorder);

LogicalChildren次のプロパティも実装する必要があります。

protected override System.Collections.IEnumerator LogicalChildren
{
    get 
    { 
        yield return _errorBorder;
    }
}

複数の子供がいる場合は、を使用しUIElementCollectionます。LogicalChildrenそれらを視覚的および論理的なツリーに追加し、、、、VisualChildrenCountおよびGetVisualChildオーバーライドから使用できます。

于 2011-08-04T14:29:18.177 に答える