Как мне переместить окно на основе данных mvvm? - PullRequest
0 голосов
/ 05 июня 2019

У меня есть распределенное приложение, которое запускает десятки экземпляров одного и того же приложения. Положение запуска каждого экземпляра задается временем начала процесса, чтобы позиционироваться в сетке окон. Каждый экземпляр принимает запросы на обработку из очереди БД, и они управляются процедурой хранения БД. Используемая сторонняя библиотека имеет большой объем памяти и вычислительную нагрузку и случайным образом завершает работу приложения каждые несколько сотен запросов. Имеется функция восстановления после сбоев, и при обнаружении сбоев запросы сбойного процесса помещаются в очередь для все еще работающих экземпляров приложения. Восстановление после сбоев основано на регулярной записи каждого экземпляра в файл журнала БД. Если экземпляр приложения не записал в журнал в определенный период времени, обнаруживается сбой и инициируется восстановление. Со временем запускаются новые экземпляры приложений, которые заменяют сбойные, и там, где местоположение запуска по времени запуска может размещать их поверх окон существующих экземпляров. Цель состоит в том, чтобы экземпляр перемещался в новый порядок времени запуска в регулярном цикле на основе времени запуска запущенных экземпляров. Записи журнала БД обновляются до текстового поля, и существует привязка через шаблон MVVM. Мне нужно переместить окна, основываясь на значениях, идущих в текстовое поле, чтобы они смещали местоположение в соответствии с новым порядком времени запуска все еще работающих экземпляров. Примеры основаны на событиях GUI, а не на привязках данных. Я в растерянности, как это сделать.

Я не смог найти метод для этого

Исходное местоположение задается с помощью этого кода

public MainWindow()
{
    InitializeComponent();

    this.Closing += Window_Closing;


    WindowStartupLocation = WindowStartupLocation.Manual;

    // get window hieght and width
    _windowHeight = Convert.ToInt32(ConfigurationManager.AppSettings["AppHeight"]);
    _windowWidth = Convert.ToInt32(ConfigurationManager.AppSettings["AppWidth"]);

    // get count of apps to fit on screen
    _downAppCount = (int)Math.Floor(System.Windows.SystemParameters.PrimaryScreenHeight / ( _windowHeight + 1 ));
    _acrossAppCount = (int)Math.Floor(System.Windows.SystemParameters.PrimaryScreenWidth / ( _windowWidth + 1 ));

    // get the start order of this process relative to all running to determine screen position
    _currentProcess = Process.GetCurrentProcess();
    int i = 0;
    foreach ( Process proc in Process.GetProcessesByName(_currentProcess.ProcessName).OrderBy(x => x.StartTime).ToArray() )
    {
        i++;
        if ( proc.Id == _currentProcess.Id )
        {
            _processOrder = i;
        }
    }

    // set postion on screen
    this.Top = Math.Floor(( (double)_processOrder - 1 ) / _acrossAppCount ) * ( _windowHeight + 1 );
    this.Left =          (( (double)_processOrder - 1 ) % _acrossAppCount ) * ( _windowWidth  + 1 );

}

Я надеюсь менять местоположение каждого экземпляра каждый раз, когда приложение отменяет запрос, и сообщение отправляется в TextBox, указывая это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...