2013-07-22 7 views
0

У меня есть следующий код, который прикрепляет Adorner s к UIElement s, который у меня есть на Canvas.WPF richTextBox can not идентифицировать как 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 - это Document RichTextBox, на который вы нажали. Это FlowDocument, который не является производным от UIElement.

Вы можете получить доступ к RichTextBox с помощью свойства FlowDocument Parent.

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

Фантастический, спасибо. Теперь я могу щелкнуть и переместить и изменить размер RichTextBox, но я не могу на самом деле ввести что-либо. Я прикрепляю adorners для изменения размера и перемещения элементов управления на Canvas. Будет ли это то, что мое событие previewLeftMouseButtonDown запускается, прежде чем я могу ввести что-либо в RichTextBox? – kev3kev3

+0

Да, наверное. За исключением случаев, когда вы перемещаете фокус с клавиатуры, клавишей Tab. Если ваш adorner предназначен для указания фокуса ввода, вы можете лучше привязать обработчики к [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