В своем вопросе вы пишете «WPF», но ваш скриншот явно является приложением Windows Forms, поэтому я предоставлю ответ для Windows Forms. Тем не менее, он может быть легко изменен для работы с WPF.
Хотя вы можете проверять каждое текстовое поле в отдельности, интересная часть вашего вопроса заключается в том, как выполнить проверку для нескольких элементов управления. При выполнении проверки вы должны решить, как приложение должно вести себя, когда входные данные являются как недействительными, так и действительными. Простой и хороший способ - обновить визуальное состояние, основываясь на достоверности ввода. Например, кнопка может быть нажата только тогда, когда весь ввод действителен. Это позволяет избежать ситуации, когда ввод недопустим, пользователь нажимает кнопку, а затем получает ошибку, которая должна быть отклонена. Для дальнейшего уточнения этого вы можете предоставить подсказки в пользовательском интерфейсе о том, почему что-то не так.
Исходя из вашего скриншота, я предполагаю, что вы хотите предоставить некоторую информацию о результате проверки в большом текстовом поле. Вы можете создать метод для обновления содержимого этого текстового поля на основе содержимого других текстовых полей. Вместо обновления большого текстового поля этот метод может также включать и отключать кнопки и т. Д. Для более реалистичного сценария.
private void UpdateVisualState()
{
var ipString = $"{textBox1.Text}.{textBox2.Text}.{textBox3.Text}.{textBox4.Text}";
infoTextBox.Text = IPAddress.TryParse(ipString, out var address)
? address.ToString()
: "(Invalid IP address)";
}
Этот метод возьмет текст из textBox1
- textBox4
, создаст из него IP-адрес, проанализирует этот IP-адрес и обновит infoTextBox
либо проанализированным IP-адресом, либо текстом, который указывает, что IP-адрес недействителен.
Теперь все, что вам нужно сделать, это вызывать этот метод каждый раз, когда текст в каждом из текстовых полей октета IP-адреса изменяется:
private void textBox1_TextChanged(object sender, EventArgs e)
{
UpdateVisualState();
}
То же самое для оставшихся трех текстовых полей с IP-адресом. октетов.
Это очень простой способ проверки всего состояния формы, и, поскольку ваш пользовательский интерфейс и правила проверки становятся более сложными, вы можете обнаружить, что он не так хорошо масштабируется. Тем не менее, чтобы начать это, если все в порядке.
Чтобы узнать о более продвинутых способах проверки, вы можете прочитать Проверка ввода пользователя в Windows Forms .
Я уже реализовывал подобные вещи раньше. Дело не столько в java, сколько в том, какие символы отправлять в консоль.
Ключевым моментом является разница между \ n
и \ r
.
\ n
переходит в начало новой строки. Но \ r
- это просто возврат каретки - он возвращается в начало той же строки.
Итак, вам нужно распечатать индикатор выполнения, например, печать строки
"|======== |\r"
На следующем тике индикатора выполнения замените ту же строку более длинной полосой. (поскольку мы используем \ r, мы остаемся в той же строке) Например:
"|========= |\r"
Что вы должны помнить, когда закончите, если вы затем просто напечатаете
"done!\n"
У вас все еще может быть мусор из-за прогресса бар на линии. Поэтому после того, как вы закончите с индикатором выполнения, обязательно напечатайте достаточно пробелов, чтобы удалить его из строки. Например:
"done |\n"
Надеюсь, что это поможет.
Пример C #, но я предполагаю, что это то же самое для System.out.print
в Java.
Не стесняйтесь поправлять меня, если я ошибаюсь.
По сути, вы хотите написать escape-символ \ r
в начале вашего сообщения
что приведет к тому, что курсор вернется в начало строки (перевод строки) без перехода к следующей строке.
static string DisplayBar(int i)
{
StringBuilder sb = new StringBuilder();
int x = i / 2;
sb.Append("|");
for (int k = 0; k < 50; k++)
sb.AppendFormat("{0}", ((x <= k) ? " " : "="));
sb.Append("|");
return sb.ToString();
}
static void Main(string[] args)
{
for (int i = 0; i <= 100; i++)
{
System.Threading.Thread.Sleep(200);
Console.Write("\r{0} {1}% Done", DisplayBar(i), i);
}
Console.ReadLine();
}
Это возможно с помощью библиотеки Java Curses. Это то, что я нашел. Сам я им не пользовался и не знаю, кроссплатформенный ли он.
Я обнаружил, что следующий код работает правильно. Он записывает байты в выходной буфер. Возможно, эти методы, использующие писатель, например метод System.out.println ()
, заменяют вхождения \ r
на \ n
, чтобы соответствовать окончанию родной строки цели (если не настроен должным образом).
public class Main{
public static void main(String[] arg) throws Exception {
String anim= "|/-\\";
for (int x =0 ; x < 100 ; x++) {
String data = "\r" + anim.charAt(x % anim.length()) + " " + x;
System.out.write(data.getBytes());
Thread.sleep(100);
}
}
}