Мне нужно включить следующее в моем приложении (приложение С# WPF):

  1. Иметь нормальный размер 1024*768
  2. Пользователь может развернуть приложение
  3. Пользователь может свернуть приложение
  4. Пользователь может восстановить приложение (1024*768)
  5. Пользователь не может вручную изменить размер приложения, перетащив его границу.

Нет ни одного ResizeMode, удовлетворяющего всем этим требованиям. Есть ли способ сделать это?

5
Nir 1 Фев 2010 в 12:38
2
Добавив свойства окна Height="1024" Width="768" ResizeMode="CanMinimize", вы можете добиться всего, кроме пункта 2.
 – 
ChrisF
1 Фев 2010 в 15:29
Можете ли вы рассказать нам, почему вы хотите исправить окно определенного размера? Это может помочь нам придумать некоторые решения.
 – 
Benny Jobigan
2 Фев 2010 в 14:52
Я работаю над медицинской программой, которая представляет медицинское изображение. Старая программа имела фиксированный размер 1024*768. Следовательно, для старых клиентов нам нужно сохранить его в качестве основного разрешения. Мы хотим иметь возможность максимизировать окно, чтобы мы могли проверять программу при определенных наборах разрешений без необходимости проверять качество представленного изображения в случае, если пользователь изменяет размер приложения до нестандартного размера.
 – 
Nir
2 Фев 2010 в 17:22

2 ответа

Наконец-то я нашел относительно приличное решение.

Идея состоит в том, чтобы переопределить событие OnStateChanged окна, отменить ограничения Min/Max и обновить его.

Если окно не развернуто, мы просто применяем обратно ограничения Min/Max.

    protected override void OnStateChanged(EventArgs e)
    {
        if (WindowState == WindowState.Maximized)
        {
            MinWidth = 0;
            MinHeight = 0;
            MaxWidth = int.MaxValue;
            MaxHeight = int.MaxValue;

            if (!m_isDuringMaximizing)
            {
                m_isDuringMaximizing = true;
                WindowState = WindowState.Normal;
                WindowState = WindowState.Maximized;
                m_isDuringMaximizing = false;
            }
        }
        else if (!m_isDuringMaximizing)
        {
            MinWidth = 1024;
            MinHeight = 768;
            MaxWidth = 1024;
            MaxHeight = 768;
        }

        base.OnStateChanged(e);
    }
6
Marius Bancila 8 Май 2014 в 11:53
1
Я знаю, что спрашиваю это через 5 лет, но что здесь m_isDuringMaximizing?
 – 
Shahid M Zubair
30 Июн 2015 в 04:03
m_isDuringMaximizing — это логическое поле, которое предотвращает зацикливание метода при изменении состояния изнутри самого себя.
 – 
Jack
21 Дек 2018 в 12:04

Вы можете прослушать событие Window.SizeChanged и внутри вашего обработчика вручную установить ширину и высоту обратно на 1027 и 768. Он по-прежнему позволяет пользователю перетаскивать края окна для изменения размера, но затем окно возвращается к установленному размеру. Недостаток этого в том, что окно «зависает» всякий раз, когда пользователь пытается изменить размер — не самое приятное зрелище. Минимизация и максимизация работают как обычно.

0
Benny Jobigan 2 Фев 2010 в 15:21
Спасибо, это я уже пробовал. Мерцание («Припадок»), с которым я столкнулся (как вы сказали), заставило меня оставить эту идею в начале.
 – 
Nir
2 Фев 2010 в 17:23