2011-07-14 1 views
5

私はRichTextBoxを持っています。このボタンには、ユーザーがコンテンツを編集しているときに、適切に削除(処理)されるべきいくつかのボタンが含まれている必要があります。 <Button>制御要素ではない(バックスペース、削除または切り取り)テキスト(文字)を削除しているかどうかを確認することができます。添付RichTextBox内のUIElementを削除する(Backspace、Delete、または 'Cut')かどうかを確認するにはどうすればいいですか?

は私がstart.GetTextInRunのみを取得することを理解

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 
    } 

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

を使用したコードですテキスト、私は得るボタンをバックスペーシングするときの値 ""(null)。しかし、私はstart.GetAdjacentElementも試してみましたが、同じ条件でaを取得することはできません。

助けてください!

+0

RTBに対するキャレットとボタンの位置を計算します。ここに私のコードです。 – Code0987

+0

私はちょうどあなたを得ることはできません..私はどのようにそれを行うのですか?私はキャレットの位置を得ることができますが、私はボタンを得ることができません –

+0

私は物理的な位置を意味します。彼らの物理的な位置を計算することができますし、それらが衝突し、条件が一致する場合は、あなたのものを行います。 – Code0987

答えて

-1

私はあなたのコードを(大まかに)複製しました。追加したボタンの後にカーソルを置いてBackspaceを押すと、ボタンはPreviewKeyDownコードなしでもRichTextBoxから削除されます。答えはまったく何もする必要がないということなので、私は非常に混乱しています。

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

と背後にあるコード...

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、あなたが行っていることは正確には得られません。ボタンを削除したくないので、PreviewKeyDownでチェックしています。私が見ることができるものから、あなたは 'B'を押すときにボタンを追加していますか? –

+0

申し訳ありませんもうもう覚えていません...私の結論は、このコントロールはちょっとしたものであり、箱から出てくるもの以外には使用しないでください。 –

関連する問題