2015-07-27 1 views
0

У меня есть TextBox, который имеет много строк текста, это время обновления, как это:Как получить строку TextBox из положения мыши?

public void UpdateMessageBox(TextBox textBox, string text) 
    { 
     textBox.SelectionStart = 0; 
     textBox.SelectionLength = 0; 
     textBox.SelectedText = String.Format("{0:HH:mm:ss }", DateTime.Now) + text + "\n"; 
     textBox.ScrollToHome(); 
    } 

Теперь мне нужно получить текст из строки, на которой мыши средняя кнопка была нажата сразу, не выбирая линию щелкнув левой кнопкой мыши.

private void textBox_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
    { 
     if (e.ChangedButton == MouseButton.Middle && e.ButtonState == MouseButtonState.Pressed) 
     { 
      e.MouseDevice.GetPosition(textBox) //what next? 
     } 
    } 

Как я могу получить строку textBox и текст из положения мыши?

ответ

2

XAML

<Grid x:Name="LayoutRoot"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <TextBox Width="300" 
      Height="200" 
      PreviewMouseDown="TextBox_PreviewMouseDown" 
      Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut consectetur iaculis enim sed condimentum. Nunc vestibulum fermentum fermentum. Nam arcu ipsum, vestibulum eu felis a, varius gravida dolor. Pellentesque tempor cursus quam, mattis volutpat odio eleifend cursus. Morbi placerat auctor aliquam. Aliquam erat volutpat. Curabitur dictum convallis nibh in ullamcorper. " 
      TextWrapping="Wrap" /> 
    <TextBlock x:Name="myTextBlock" 
      Grid.Row="1" 
      HorizontalAlignment="Center" /> 
</Grid> 

Codebehind

private void TextBox_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    if (e.ChangedButton == MouseButton.Middle) 
    { 
     var myTextBox = (TextBox)sender; 

     var myCharIndex = myTextBox.GetCharacterIndexFromPoint(Mouse.GetPosition(myTextBox), true); 
     var myLineIndex = myTextBox.GetLineIndexFromCharacterIndex(myCharIndex); 

     var myLine = myTextBox.GetLineText(myLineIndex); 

     myTextBlock.Text = myLine; 
    } 
} 
+1

здорово! Можете ли вы уточнить: 1) Зачем нам нужен myTextBox.CaptureMouse()? - он работал бы без этой строки 2) «используя PreviewMouseUp, чем PreviewMouseDown - вы получаете, какая кнопка нажата по умолчанию, а не проверять себя»? – Dork

+1

Ha! Просто верну свой ответ и увидев все ошибки - слишком много печатают сегодня. Я немного отредактировал ответ, чтобы разобраться. Обратите внимание на опечатку, которую я сделал - «PreviewMouseDown =« TextBox_PreviewMouseUp ». Я предположил, что вы не можете получить нажатой кнопку из PreviewMouseDown, которая была * неправильной *. Я также снял код myCharIndex здесь: http://stackoverflow.com/a/10620373/1095741, который использовал myTextBox.CaptureMouse, чтобы получить щелчок мыши, а не событие. – goobering