2011-07-14 4 views
5

Ho un RichTextBox che deve contenere alcuni pulsanti che dovrebbero essere cancellati correttamente (gestiti) quando l'utente sta modificando il contenuto in esso. Sono in grado di controllare se sto cancellando (Backspace, Delete o Cut) il testo (caratteri) ma non l'elemento di controllo <Button>.Come controllare se sto cancellando (Backspace, Delete o 'Cut') un UIElement in un RichTextBox?

In allegato è il codice che ho usato

XAML

 <RichTextBox x:Name="tRTB" 
        HorizontalAlignment="Left" 
        Keyboard.PreviewKeyDown="tRTB_PreviewKeyDown" 
        PreviewTextInput="tRTB_PreviewTextInput"> 
      <local:EnabledFlowDocument x:Name="tFD"> 
       <Paragraph x:Name="tP"> 
       </Paragraph> 
      </local:EnabledFlowDocument> 
     </RichTextBox> 

C#

public void AppendNewButton(int i) 
    { 
     Button addB = new Button(); 
     addB.Content = i; 
     addB.HorizontalAlignment = HorizontalAlignment.Left; 
     tP.Inlines.Add(addB); 
     tP.Inlines.Add("Bk" + i.ToString()); //appends a button and text in RTB 
    } 

e

private void tRTB_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Back) 
     { 
      var start = tRTB.CaretPosition; 
      var t = start.GetTextInRun(LogicalDirection.Backward); 
      var end = start.GetNextContextPosition(LogicalDirection.Backward); 
      var t1 = end.GetTextInRun(LogicalDirection.Backward); 
      tRTB.Selection.Select(start, end); 
      tRTB.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Black); 
      tRTB.Selection.Select(start, start); 

      //should handle deletion of button here 
      /* if (button is before cursor) */ 
      /* e.Handled=true; */ 
     } 
    } 

Capisco che lo start.GetTextInRun ottiene solo il testo, e ottengo il valore "" (null) quando si esegue il backspacing di un pulsante. Ma ho provato anche start.GetAdjacentElement, ma non riesco a recuperarlo nella stessa condizione.

Si prega di aiuto!

+0

calcolare la posizione di Caret e Button, rispetto a RTB. – Code0987

+0

Non ti compro esattamente .. Come faccio? Posso ottenere la posizione di accento circonflesso, ma non riesco a ottenere il valore –

+0

del pulsante intendo posizione fisica. Puoi calcolare la loro posizione fisica e poi se si scontrano e le tue condizioni corrispondono, fai le tue cose. – Code0987

risposta

-1

Ho appena replicato il codice sopra (approssimativamente) e quando ho posizionato il cursore dopo il pulsante aggiunto e premuto Backspace, il pulsante viene rimosso da RichTextBox anche senza il codice PreviewKeyDown. Quindi sono molto confuso perché sembra che la risposta sia solo che non devi assolutamente fare nulla. Qui è il mio codice:

<Window x:Class="WpfApplication4.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
    <RichTextBox 
     x:Name="tRTB" 
     HorizontalAlignment="Left" 
     Keyboard.PreviewKeyDown="tRTB_PreviewKeyDown"> 
    </RichTextBox> 
    </Grid> 
</Window> 

e il codice dietro ...

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public void AppendNewButton(int i) 
    { 
     Button addB = new Button(); 
     addB.Content = i; 
     addB.HorizontalAlignment = HorizontalAlignment.Left; 

     var insertionPosition = tRTB.CaretPosition.GetInsertionPosition(LogicalDirection.Forward); 

     var inline = new InlineUIContainer(addB); 
     insertionPosition.Paragraph.Inlines.InsertAfter(
      (Inline)insertionPosition.Parent, 
      inline); 

     tRTB.CaretPosition = tRTB.CaretPosition.GetNextInsertionPosition(LogicalDirection.Forward); 
    } 

    public void tRTB_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.B) 
     { 
      AppendNewButton(7); 
      e.Handled = true; 
     } 
    } 
} 
+0

um, non esattamente quello che stai facendo lì. non voglio che il pulsante sia rimosso, ecco perché sto verificando PreviewKeyDown. da quello che posso vedere, stai aggiungendo un pulsante quando premi "B"? –

+0

Mi spiace di non ricordare più ... la mia conclusione è stata che questo controllo è solo zoppo e non dovrebbe essere usato per qualcosa di più di ciò che dà fuori dalla scatola. –

Problemi correlati