2011-07-14 12 views
5

RichTextBox adresinde, kullanıcı içeriği düzenlerken düzgün şekilde (işlendiğinde) silinmesi gereken bazı düğmeler içermesi gerekiyor. Silmek (Backspace, Delete veya Cut) metni (karakterleri) sildiğimi, ancak <Button> denetim öğesinin olup olmadığını kontrol edebiliyorum. Ekli Bir RichTextBox'ta bir UIElement'i sildiğim (Backspace, Delete veya 'Cut') olup olmadığını nasıl kontrol edebilirim?

Ben

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> 

kullandım kodudur 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 
    } 

ve

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; */ 
     } 
    } 

Ben start.GetTextInRun sadece alır anlıyoruz metin alıyorum Bir düğmeyi geri oynatırken "" (null) değeri. Ama ben start.GetAdjacentElement denedim ama aynı durumda bir almak için başarılı olamıyorum.

yardım edin!

+0

RTB göre İmleciyle ve Düğme, konumunu hesaplayın: İşte benim kod. – Code0987

+0

Tam olarak anlamadım .. Bunu nasıl yaparım? Bakma pozisyonunu alabilirim ama düğmenin –

+0

kodunu alamıyorum. Fiziksel pozisyonlarını hesaplayabilir ve çarpışırsa ve durumunuz eşleşirse, eşyalarınızı yapın. – Code0987

cevap

-1

Yukarıdaki kodunuzu çoğalttım (kabaca) ve imleci ekledikten sonra imleci koyduğumda ve Geri tuşuna basıldığında, RichTextBox'tan PreviewKeyDown kodunuz olmasa bile düğme kaldırılır. Bu yüzden kafam çok kafam karıştı çünkü cevap sadece bir şey yapmanıza gerek olmadığı gibi görünüyor.

<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> 

ve arkasında kod ...

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, orada ne yaptığınızı tam olarak anlamıyorum. Düğmenin kaldırılmasını istemiyorum, bu yüzden PreviewKeyDown'da kontrol ediyorum. Gördüğüm kadarıyla, 'B' düğmesine bastığınızda bir düğme ekliyor musunuz? –

+0

Maalesef artık hatırlamıyorum bile ... sonuçta bu kontrolün topal olduğu ve kutudan verdiği şeyden daha fazlası için kullanılmaması gerektiğiydi. –

İlgili konular