

入力テキスト全体の文字数を数える方法は分かりました。`TextChanged`イベントを使い、`charCount =
input.Text.Length`で数を出すという方法です。

では、ある文字が入力テキストの中にいくつあるか探す場合はどういう風にしたらいいですか？  
※どちらの文字（検索ワード、検索されるテキスト）もテキストボックスにて入力されます。

例  
入力テキスト → 12月はクリスマスと正月を控え忙しい月です。  
入力検索ワード → 月

結果は3文字


CC BY-SA 4.0
2018-12-03T15:43:47.647
50875
2018-12-05T04:43:36.747
2018-12-05T04:43:36.747
3060
31225
question
c# wpf
テキストの中から任意の文字を探し出す方法


一例として：

[code]

    string target = "12月はクリスマスと正月を控え忙しい月です。";
    string find = "月";
    int count = 0;
    
    int index = target.IndexOf(find, StringComparison.Ordinal);
    while (0 <= index)
    {
        count++;
        index = target.IndexOf(find, index + 1, StringComparison.Ordinal);
    }
    // count = 3
    
[/code]

先頭から順番に文字列を探し、見つかれば count に 1 を足して、次の文字列を探すことを繰り返します。


CC BY-SA 4.0
2018-12-03T21:48:56.990
50879
2018-12-03T21:48:56.990
4684
50875
answer


文字列の全体の長さ - 対象文字を削除した文字列の長さ = 対象の文字件数

[code]

    str.Length - str.Replace(chara.ToString(), "").Length;
    
[/code]


CC BY-SA 4.0
2018-12-04T00:09:50.007
50880
2018-12-04T00:09:50.007
50875
answer


WPFには豊富なバインディング機能があります。

  * コンバーターを使用することで、変換ロジックをコードで記述できます。質問のようなカウント処理も表現できます。`IValueConverter`を実装します。
  * `MultiBinding`を使用すると複数の値をバインドできるようになります。 **入力テキスト** と **入力検索ワード** の２つをバインドできます。  
この場合、コンバーターとしては`IMultiValueConverter`を実装します。

  * `Binding`には`StringFormat`があり、書式を指定できます。

文字の数え方は他の方が回答されていますが、正規表現でマッチした数を使う方法もあります。以上をまとめると、`IMultiValueConverter`を実装した`CountConverter`を定義します。

[code]

    public class CountConverter : IMultiValueConverter {
        static int Count(string input, string pattern)
            => Regex.Matches(input, Regex.Escape(pattern)).Count;
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
            => Count((string)values[0], (string)values[1]);
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
            => throw new NotImplementedException();
    }
    
[/code]

XAML側はリソースディクショナリにコンバーター登録しておきます。

[code]

    <Window.Resources>
        <local:CountConverter x:Key="CountConverter" />
    </Window.Resources>
    
[/code]

あとは`TextBox`と`TextBlock`を用意しバインドします。

[code]

    <TextBox Name="source" Text="12月はクリスマスと正月を控え忙しい月です。" HorizontalAlignment="Left" Height="23" Margin="28,29,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="300" />
    <TextBox Name="template" Text="月" HorizontalAlignment="Left" Height="23" Margin="28,57,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" />
    <TextBlock HorizontalAlignment="Left" Margin="28,85,0,0" TextWrapping="Wrap" VerticalAlignment="Top">
        <TextBlock.Text>
            <MultiBinding Converter="{StaticResource CountConverter}" StringFormat="結果は{0}文字">
                <Binding ElementName="source" Path="Text" />
                <Binding ElementName="template" Path="Text" />
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>
    
[/code]

もちろんバインドで実現されているため、文字を編集するとほぼリアルタイムに結果が反映されます。

[![画像の説明をここに入力](https://i.stack.imgur.com/xBNFG.png)](https://i.stack.imgur.com/xBNFG.png)


CC BY-SA 4.0
2018-12-04T00:27:00.627
50881
2018-12-04T00:27:00.627
4236
50875
answer