Как изменить конкретные символы в label?

По умолчанию у меня Label содержит контент 0/0, но при вводе получается вот так:

После ввода в текстовое поле, у меня Label показывает количество введённых символов.

Как сделать, что бы менялся 1 символ в Label, а не всё содержимое? То есть вот к примеру: было 0/0, ввели фыв, cтало 3/0.

Сам код вот:

private void pbPas_PasswordChanged(object sender, RoutedEventArgs e)
{
    labP.Content = pbPas.Password.Length.ToString(CultureInfo.InvariantCulture);
}

private void tbLog_TextChanged(object sender, TextChangedEventArgs e)
{
    labL.Content = tbLog.Text.Length.ToString(CultureInfo.InvariantCulture);
}

Ответы (1 шт):

Автор решения: aepot

Решение в лоб, невзирая на то, что вы пошли неверным путём при организации структуры приложения WPF. Что ж, учитесь, разбирайтесь. Если интересно узнать WPF поближе, почитайте про шаблон проектирования MVVM и привязки данных.

string text = labP.Content.ToString();
string[] parts = text.Contains('/') ? text.Split('/') : new string[] { "0", "0" };
labP.Content = $"{pbPas.Password.Length}/{parts[1]}";

Или если второе значение - константа, можно так, по-простому:

labP.Content = $"{pbPas.Password.Length}/0";

В WPF не рекомендуется использовать Label для отображения текста, вместо него рекомендуется использовать TextBlock. У него к тому же есть свойтво Text, которое содержит string, и его не надо приводить к строке через .ToString().

А по поводу того, что свойство Password у PasswordBox использовать нельзя (это небезопасно), я писал здесь.


Обновлено

Ну задумка следущая. TextBlock содержит текст 0/30 30 - это максимальное количесво вводимых символов.

Ну тогда это делается без единой строчки C# кода, в XAML разметке. Можно даже например перекрасить 30/30 в красный цвет, когда оно достигнет этого значения.

<StackPanel>
    <TextBox x:Name="TextBoxLogin" MaxLength="30"/>
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
        <StackPanel.Resources>
            <Style TargetType="TextBlock">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Text.Length, ElementName=TextBoxLogin}" Value="30">
                        <Setter Property="Foreground" Value="Red"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </StackPanel.Resources>
        <TextBlock Text="{Binding Text.Length, ElementName=TextBoxLogin, StringFormat={}{0}/}"/>
        <TextBlock Text="{Binding MaxLength, ElementName=TextBoxLogin}"/>
    </StackPanel>
</StackPanel>

Или по совету @EvgeniyZ еще так можно:
(результат одинаковый)

<StackPanel>
    <TextBox x:Name="TextBoxLogin" MaxLength="30"/>
    <TextBlock HorizontalAlignment="Right">
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Text.Length, ElementName=TextBoxLogin}" Value="30">
                        <Setter Property="Foreground" Value="Red"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
        <Run Text="{Binding Text.Length, ElementName=TextBoxLogin, Mode=OneWay}"/>/<Run Text="{Binding MaxLength, ElementName=TextBoxLogin}"/>
    </TextBlock>
</StackPanel>

введите сюда описание изображения

→ Ссылка