崇拜者和装饰元素事件
我有一个自定义的线条形状,该线条使用装饰物在该行的中间显示一个数组和一些文本。
I have a custom Line Shape that use an adorner to display an array and some text in the middle of that line.
问题是装饰的行为独立于装饰元素,并且确实而不是将事件转移给它。在下面的代码中,我被迫手动将adorner元素重新链接到装饰元素( ta.MouseLeftButtonDown + = Adorner_MouseLeftButtonDown;
),但不幸的是,这甚至无法正常工作...
有人可以告诉我调用this.OnMouseLeftButtonDown的问题是什么,为什么我没有收到相应的事件?
The problem is that the adorned behaves independently of the adorned element, and does not "transfer" the event to it. In the following code I am forced to manually relink the adorner elements to adorned element (ta.MouseLeftButtonDown += Adorner_MouseLeftButtonDown;
), but unfortunately even this does not work...
Could somebody advice what is wrong when calling this.OnMouseLeftButtonDown, why I don't receive the respective event?
public class SegmentLine : Shape
{
AdornerLayer aLayer;
public static readonly DependencyProperty X1Property;
public static readonly DependencyProperty X2Property;
public static readonly DependencyProperty Y1Property;
public static readonly DependencyProperty Y2Property;
...
static SegmentLine() {
X1Property = DependencyProperty.Register("X1", typeof(double), typeof(SegmentLine), new FrameworkPropertyMetadata(double.NaN,
FrameworkPropertyMetadataOptions.AffectsRender));
X2Pro...
}
public SegmentLine()
: base()
{
this.Loaded += SegmentLine_Loaded;
}
void SegmentLine_Loaded(object sender, RoutedEventArgs e)
{
aLayer = AdornerLayer.GetAdornerLayer(this);
if (aLayer != null)
{
TextAdorner ta = new TextAdorner(this);
//ta.IsHitTestVisible = false;
ta.MouseLeftButtonDown += Adorner_MouseLeftButtonDown;
aLayer.Add(ta);
}
}
void Adorner_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
// !! try to rise the MouseLeftButtonDown event
this.OnMouseLeftButtonDown(e);
}
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
if (aLayer != null)
aLayer.Update();
}
class TextAdorner : Adorner
{
public TextAdorner(UIElement adornedElement)
: base(adornedElement) { }
protected override void OnRender(DrawingContext drawingContext)
{
// ADD LABEL ...
FormattedText ft = new FormattedText(...);
drawingContext.DrawText(ft, midPoint);
// Add ARROW ...
var myPathGeometry = new PathGeometry { Figures = myPathFigureCollection };
drawingContext.DrawGeometry(Brushes.Black, null, myPathGeometry);
}
}
protected override System.Windows.Media.Geometry DefiningGeometry
{
get
{
var geometryGroup = new GeometryGroup();
// Add line
geometryGroup.Children.Add(new LineGeometry(new Point(X1, Y1), new Point(X2, Y2)));
return geometryGroup;
}
}
}
您应该调用 this.RaiseEvent(e);
而不是 this.OnMouseLeftButtonDown(e);
将事件转移到装饰元素。
而且,您只能使用一个事件处理程序来转移几种事件类型
You should call this.RaiseEvent(e);
instead of this.OnMouseLeftButtonDown(e);
to transfer the event to the adorned element.
And by the way, you can use only one event handler to transfer several event types
void SegmentLine_Loaded(object sender, RoutedEventArgs e)
{
..
ta.MouseLeftButtonDown += Adorner_AnyEvent;
ta.MouseRightButtonDown += Adorner_AnyEvent;
}
void Adorner_AnyEvent(object sender, RoutedEventArgs e)
{
this.RaiseEvent(e);
}