2011-01-07 10 views
0

この問題を解決しようとしました。私はテキストとドキュメントのプロパティのためのbindable richTextBoxを持っています、このコントロールは、拡張WPFツールキットからのrichTextBoxから派生しています。ユーザーの入力中にテキストを笑顔のテキストに変換する

私はrichTextBoxにテキストを入力しています。テキストの絵文字を書いた場合、このテキストの絵文字をイメージの絵文字に変換し、richTextBoxに表示します。例えば

:こんにちは:) - >こんにちは、世界のIMAGE_SMILE

私はテキストと画像と段落のタイプに顔文字で文字列を変換独自のクラスを持っています。ここで

はそれをイスト:WPFアプリケーションで

public Paragraph ConvertToMessageWithEmoticons(string rpText){...} 

私はRichTextBoxコントロールのテキストやドキュメントのプロパティのプロパティをバインドします。

//bind on Text property of richTextBoxControl 
    public string RtbText 
    { 
     get { return _rtbText; } 
     set 
     { 
      _rtbText = value; 
      NotifyPropertyChanged("RtbText"); 
     } 
    } 

    //bind on Document property of richTextBoxControl 
    public FlowDocument RtbFlowDocument 
    { 
     get { return _rtbFlowDocument; } 
     set 
     { 
      _rtbFlowDocument = value; 
      NotifyPropertyChanged("RtbFlowDocument"); 
     } 
    } 

は、私は、.NET(Rx)のための反応性の拡張機能を使用して、プロパティRtbText

にオブザーバーを作る
 Observable.FromEvent<PropertyChangedEventArgs>(this, "PropertyChanged") 
      .Where(e => e.EventArgs.PropertyName == "RtbText") 
      .Select(_ => this.RtbText) 
      .Where(text => text.Length > 1) 
      .Do(AddSmiles) 
      .Throttle(TimeSpan.FromSeconds(500)) 
      .Subscribe(AddSmiles); 

私の問題は、絵文字をテキストに笑顔でテキストを置き換える方法をエレガントです。

private void AddSmiles(string text) 
    { 
     Paragraph paragraph = _smileConverter.ConvertToMessageWithEmoticons(RtbText); 

     RtbFlowDocument.Blocks.Clear(); 

     RtbFlowDocument.Blocks.Add(paragraph); 
    } 

私は笑顔でRtbTextの唯一の3最後の文字をチェックしてみますが、ユーザータイピングプロパティがある場合RtbTextはまだ変更されています。私はこれを試してみてください。

ユーザーの入力中にテキストとテキストを笑顔で置き換える方法についてアドバイスしますか?

答えて

0

カレットの位置を取得した場合、テキストが変更されたときにカレット周辺の文字(前の3番目と次の3番目の文字)を検索できます。

1

私はこのようなクラスを実装しています(閉じたソースですが、それ以外は共有します)。トリッキーな部分は、ユーザーがバックスペースに当たったときのキャレットの位置を管理することです - その場合、エッジケース(段落、文書などの始まり/終わり)を処理しながら、Smileyを:-に戻す必要があります。

関連する問題