2012-03-03 11 views
0

でテキストボックス内のテキストをハイライト表示する方法:は、私は次のシナリオ持ちのWindows PhoneプロジェクトでのWindows Phone 7

  1. ユーザーの種類テキストボックス
  2. ユーザーにテキストをテキストボックスを無効にする]ボタンを押します処理を開始する
  3. テキストの一部の処理が行われ、処理のすべてのステップで、テキストボックス内のテキストの特定の部分をハイライトしたい(テキスト自体は変更されません)。
  4. 処理が完了すると、テキストボックスが有効になります。

これを行う正しい方法は何ですか。

現在、私はいくつかの選択背景を設定しようとしましたが、テキストボックスSelectメソッドを使用して選択したテキストを設定しましたが、テキストボックスが有効になっていても選択を視覚的に示していません。 SelectedTextプロパティは、選択された正しいテキストを返しますが、少なくともエミュレータでは視覚的な変化はありません。 XAML私はこれを行うには他の方法に開いてい

private void btnTest_Click(object sender, RoutedEventArgs e) 
{ 
    txtTest.Select(1, 1); 
    //on this line SelectedText has the correct value 
} 

後ろ

<TextBox Name="txtTest" AcceptsReturn="True" Height="250" TextWrapping="Wrap" SelectionBackground="Red"></TextBox> 
<Button Name="btnTest" Width="200" Click="btnTest_Click">Test</Button> 

コード:ここで

は、私はそれが動作しません使用したコードです。私はセマンティック的にこれは選択肢ではないので、実際には選択肢を使いたくはありませんが、私が望むものを達成する最も簡単な方法だと感じました。特定の文字を強調表示するなど、フォントサイズを大きくするなどの手段を使用することがあります。私はまた、テキストボックスを非表示にして同じように見えるTextBlockに置き換えることができますが、これを達成するためのより簡単な方法があるはずです。

この機能を実装する正しい方法は何ですか?

答えて

0

調査の結果、TextBoxのSelectメソッドは、TextBoxにフォーカスがある場合にのみ視覚的な表示を提供することが分かりました。 TextBoxは無効になっていないときにフォーカスを持つことができないので、私には役に立たなかった。 RitchTextBoxは読み取り専用で、テキストの一部を選択するAPIは、私が使用したソリューションより複雑です。

私は、テキストを強調するために、次のコードでのTextBlockを使用:

private void SetTextBlock(TextBlock textBlock, string text, int selectedIndex) 
{ 
    textBlock.Inlines.Clear(); 
    Run previous = new Run(); 
    previous.Text = text.Substring(0, selectedIndex); 
    Run current = new Run(); 
    current.Text = text.Substring(selectedIndex, 1); 
    current.Foreground = new SolidColorBrush(Colors.Green); 
    current.FontWeight = FontWeights.ExtraBold; 
    Run next = new Run(); 
    next.Text = text.Substring(selectedIndex + 1, text.Length - selectedIndex - 1); 
    textBlock.Inlines.Add(previous); 
    textBlock.Inlines.Add(current); 
    textBlock.Inlines.Add(next); 
} 

私はテキストボックスを不可視に入力し、目に見えるのTextBlockを処理しています。ユーザーが入力を提供しているとき、私は2つを切り替えます。私はこれが正しい方法であり、私は他の解決策に開放されているのかどうかはわかりませんが、今のところこれが私が見つけた最も簡単な方法です。

1

強調表示する1つのインスタンスがある場合は、SelectionStartSelectionLengthプロパティを使用できます。

複数のインスタンスを強調表示する必要がある場合は、TextBoxをRichTextBoxに置き換え、ハイライトを適切にスタイリングして指定できます。しかし、編集モードで強調表示をすることはできません。

編集中にテキストの強調表示を有効にする必要がある場合は、独自の置換/代替テキストボックスを作成する必要があります。

+0

編集モードで強調表示する必要はありませんが、SelectメソッドまたはSelectionStartとSelectionLngthプロパティを設定した後に、電話エミュレータでの選択が視覚的に示されないという問題があります。何らかの方法でリフレッシュを強制する必要がありますか?私は私の質問にコードを追加して、私が現在やっていることを示しています。 – Stilgar

+0

@Stilgar 'Select'を使うのではなく、' SelectionStart'と 'SelectionLength'を明示的に設定すると、私のために働きます。 –

+0

私はこれを試しましたが、それが無効になっているときに悲しいことに不可能な可視表示をするために、テキストボックスにフォーカスがあるようです:( – Stilgar