Сравнение значений

224
13 апреля 2018, 14:36

Есть множество значений которые изменяются со временем. Если значение достигает определенного критического значения (у каждого оно свое), то нужно отобразить информационное окно (MessageBox). То есть одновременно может быть открыто N таких окон. Пока открыто хотя-бы одно из информационных окон основное окно должно быть заблокировано. После закрытия информационного окна новое может быть открыто не ранее чем через 5 минут.

На текущий момент есть не рабочая версия, запускается по таймеру.

private async void AlarmMaxAsync(object sender, EventArgs e)
{
        if (IoDev.NumericC01RoiOil.Value >= 10)
        {
            if (Xceed.Wpf.Toolkit.MessageBox.Show("Бла", "Внимание!!!", MessageBoxButton.OK, MessageBoxImage.Error) == MessageBoxResult.OK)
            {
               await Task.Delay(50000);
            }
        }
        if (IoDev.NumericC02RoiOil.Value >= 100)
        {
            if (Xceed.Wpf.Toolkit.MessageBox.Show("Бла бла", "Внимание!!!", MessageBoxButton.OK, MessageBoxImage.Error) == MessageBoxResult.OK)
            {
               await Task.Delay(50000);
            }
        }
        if (IoDev.NumericC03RoiOil.Value >= 1000)
        {
            if (Xceed.Wpf.Toolkit.MessageBox.Show("Бла бла бла", "Внимание!!!", MessageBoxButton.OK, MessageBoxImage.Error) == MessageBoxResult.OK)
            {
               await Task.Delay(50000);
            }
        }
   ........
}
Answer 1

Просто как идея. Сделаем класс, который будет содержать все, что надо, для проверки и вывода сообщения

class PropertyCheckItem
{
    public Func<int> Acessor { get; private set;}
    public int MaxValue  { get; private set;}
    public string Message { get; private set;}
    public PropertyCheckItem(string message, Func<int> acessor, int maxValue)
    {
        Message = message;
        Acessor = acessor;
        MaxValue = maxValue;
    }
    public bool Validate()
    {       
        return !(Acessor() >= MaxValue);        
    }
}

Сделаем окно, где будет список таких классов, и этот список будем просто проверять в цикле

class MyWnd : Window
{
    List<PropertyCheckItem> _propertyCheckers = new List<PropertyCheckItem>();
    bool closed = false;
    public MyWnd()
    {
        _propertyCheckers.Add(new PropertyCheckItem("Time in SECS more or equals 55!", ()=>DateTime.UtcNow.Second, 55));
        _propertyCheckers.Add(new PropertyCheckItem("Height of window more or equals 500!", ()=>(int)this.Height, 500));        
        _propertyCheckers.Add(new PropertyCheckItem("Width of window more or equals 500!", ()=>(int)this.Width, 500));
        this.Closed+= (sender, args) => closed = true;
        this.Loaded+= (sender, args) => CheckPorps();

    }
    private async void CheckPorps()
    {
        while (!closed)
        {
            await Task.Delay(1000);
            foreach (var item in _propertyCheckers)
            {
                if (closed) return;
                if (!item.Validate())
                {
                    if (System.Windows.MessageBox.Show(item.Message, "Caption", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.Yes) == MessageBoxResult.Yes)
                    {
                        await Task.Delay(2000);
                    }       
                }
            }
        }
    }
}

Ну и, собственно, всё. Можно добавлять проверки на любое числовое свойство или как то ещё более кастомизировать проверки.

READ ALSO
C# Разрезать текстовый файл по разделителям и сохранить в множество файлов

C# Разрезать текстовый файл по разделителям и сохранить в множество файлов

Вопрос: Есть 1 текстовый файл, в котором указаны пути файловВ списке нет разделителей типа ; или каких либо других

227
Не понятно, как работать с JSON на C# [дубликат]

Не понятно, как работать с JSON на C# [дубликат]

На данный вопрос уже ответили:

218
Сохранить файл в другую директорию

Сохранить файл в другую директорию

У меня есть директория (допустим string pathFile = P:\Database\new) , в которую нужно копировать файл, выбранный пользователемНачал писать:

240
Ликвидация формы, почему? [требует правки]

Ликвидация формы, почему? [требует правки]

При закрытии второй формы и повторном ее открытии вылетает ошибка с тем что Доступ к ликвидированному объекту не возможен?!? Раньше все норм...

196