2013-07-22 64 views
0

我有以下代碼,它附加Adorner s到UIElement s,我有一個CanvasWPF richTextBox不能識別爲UIElement

private void slideCanvas_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    { 
       selected = false; 
       if (selectedElement != null) 
       { 
        aLayer.Remove(aLayer.GetAdorners(selectedElement)[0]); 
        selectedElement = null; 
       } 
      } 

      if (e.Source != slideCanvas) 
      { 
       _isDown = true; 
       _startPoint = e.GetPosition(slideCanvas); 

       selectedElement = e.Source as UIElement; 

       _originalLeft = Canvas.GetLeft(selectedElement); 
       _originalTop = Canvas.GetTop(selectedElement); 

       aLayer = AdornerLayer.GetAdornerLayer(selectedElement); 
       aLayer.Add(new ResizingAdorner(selectedElement)); 
       selected = true; 
       e.Handled = true; 
      } 
} 

出於某種原因,儘管當我運行時程序崩潰爲RichTextBox中點擊一個RichTextBox不受e.Source發現爲UIElement

selectedElement只是null

有人可以告訴我爲什麼,請給我一個工作?

+0

您可以在該行設置一個斷點來查看「e.Source」實際是什麼。也許它是RichTextBox中的文檔元素之一。 – Clemens

+0

e.Source是{System.Windows.Documents.FlowDocument}。我不確定這意味着任何人都可以幫忙嗎? – kev3kev3

回答

1

顯然e.Source是您點擊的RichTextBox的Document。它是一個FlowDocument,它不是從UIElement派生的。

然而,您可能會通過FlowDocument的Parent屬性訪問RichTextBox。

if (e.Source is FlowDocument) 
{ 
    selectedElement = ((FlowDocument)e.Source).Parent as UIElement; 
} 
else 
{ 
    selectedElement = e.Source as UIElement; 
} 
+0

太棒了,謝謝。現在我可以單擊並移動並調整RichTextBox的大小,但實際上我無法輸入任何東西。我附加裝飾器來調整大小並在Canvas上移動控件。在我可以在RichTextBox中鍵入任何內容之前,我的previewLeftMouseButtonDown事件是否會觸發? – kev3kev3

+0

是的,我想是的。除了通過鍵盤導航焦點時,使用Tab鍵。如果您的裝飾器用於指示輸入焦點,則最好將處理程序附加到[GotFocus](http://msdn.microsoft.com/en-us/library/system.windows.uielement.gotfocus.aspx)和[LostFocus] (http://msdn.microsoft.com/en-us/library/system.windows.uielement.lostfocus.aspx)事件。或Got/LostKeyboardFocus。 – Clemens