Как изменить конкретные символы в 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 шт):
Решение в лоб, невзирая на то, что вы пошли неверным путём при организации структуры приложения 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>


