2010-11-18 11 views
5

पर घटनाक्रम मैं एक कस्टम रेखा आकार कि एक सरणी और उस लाइन के बीच में कुछ पाठ प्रदर्शित करने के लिए एक adorner उपयोग किया है।adorner और सजी तत्व

alt text

समस्या यह है कि सजी सजी तत्व की स्वतंत्र रूप से व्यवहार करती है, और नहीं है "स्थानांतरण" इसे करने के लिए घटना है। निम्नलिखित कोड में मैं मैन्युअल रूप से सजी तत्व (ta.MouseLeftButtonDown += Adorner_MouseLeftButtonDown;) को adorner तत्वों को फिर से लिंक करने के लिए मजबूर कर रहा हूँ, लेकिन दुर्भाग्य से भी यह काम नहीं करता ... सकता है किसी को सलाह जब this.OnMouseLeftButtonDown बुला, मैं क्यों प्राप्त नहीं होता है क्या गलत है संबंधित घटना?

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; 
     } 
    }  
} 
+1

तुम बस 'IsHitTestVisible' गलत पर सेट करके adorner पर सभी घटनाओं निष्क्रिय कर सकते हैं। या क्या आप कुछ घटनाओं को 'सेगमेंटलाइन' द्वारा सजावट और दूसरों द्वारा संभाला जाना चाहते हैं? –

+0

@ अल्फा माउस: नहीं, किसी भी घटना मैं चाहता हूँ adorner द्वारा नियंत्रित किया जा सकता है, लेकिन मैं सिर्फ = IsHitTestVisible झूठी (जैसा कि आप देख सकते हैं अपने कोड में टिप्पणी की) मैं घटनाओं पर सभी प्राप्त नहीं होता है निर्धारित करते हैं। – serhio

उत्तर

5

आप सजी तत्व को घटना के हस्तांतरण के लिए this.RaiseEvent(e);this.OnMouseLeftButtonDown(e); के बजाय फोन करना चाहिए।
और वैसे, आप स्थानांतरित करना केवल एक ईवेंट हैंडलर का उपयोग कर सकते कई घटना प्रकार

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); 
} 
1

मैं जानता हूँ कि इस पुरानी है, लेकिन मैं एक ऐसी ही समस्या (adorner में घटनाओं प्राप्त नहीं) है, जो मैं ड्राइंग द्वारा तय था मेरे ऑनरेंडर में एक पारदर्शी पृष्ठभूमि()

drawingContext.DrawRectangle(Brushes.Transparent, null, viewRect); 

कोई पृष्ठभूमि = कोई ईवेंट नहीं।

संबंधित मुद्दे