Отключить только окно владельца в wpf

У меня есть приложение, в котором есть окно (скажем, W1), я хочу, чтобы оно не блокировало обработку приложения, пока оно открыто. Я добился этого с помощью W1.show(). Из этого окна открывается еще одно окно (W2).

Я хочу, чтобы его поведение было чем-то вроде модального, чтобы отключить родительское окно W1, за исключением того, что не должен отключит оставшееся приложение.

Короче: когда W2 открыт

  • приложение продолжает свою работу

  • только W1 отключается

Я пытался

        W1.IsEnabled = false;
        W2.Show();
        W1.IsEnabled = true;

он перемещает фокус на W2, когда он открывается, и оставшееся приложение также продолжает свою работу, но я все еще могу использовать W1, что неверно

Если я использую

W2.ShowDialog()

тогда все приложение блокируется. Есть ли какой-то метод, с помощью которого можно отключить только родительское окно (/ владелец)?

Какие операции в w1 ... отключите вручную с помощью IsEnabled и снова включите его, когда w2 был закрыт.

TheGeneral 04.01.2019 05:20

Это может быть вариантом, если у меня нет другого решения, кроме 1) в нем слишком много элементов управления 2) попытки щелкнуть по нему не должны перемещать фокус на него (как при открытии модального окна).

Maria 04.01.2019 05:27

Какие операции нужно продолжать?

TheGeneral 04.01.2019 05:28

на самом деле это приложение для проектирования. Пользователь должен иметь возможность продолжить проектирование в главном окне (не в W1).

Maria 04.01.2019 05:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
342
2

Ответы 2

Это должно ответить на ваш вопрос:

private void Button_Click(object sender, RoutedEventArgs e)
{
    W2.Owner = W1;
    W1.IsHitTestVisible = false;
    W2.Closing += W2_Closing;
    W2.Show();
}

private void W2_Closing(object sender, CancelEventArgs e)
{
    W1.IsHitTestVisible = true;
}

Это хорошо. Есть еще несколько моментов 1) Окно W1 по-прежнему получает фокус, когда мы нажимаем на него 2) Если возможно, пытаясь щелкнуть W1 после открытия W2, W2 должен дать тот же эффект / анимацию, который мы получаем, когда мы открываем / сохраняем поскольку диалог открывается в разных приложениях, и мы пытаемся использовать главное окно

Maria 04.01.2019 11:09

Не рядом со мной. Убедитесь сами: W1.GotFocus += W1_GotFocus;. Вы сделали это, как я написал, с обработчиком событий Closing ??

Rekshino 04.01.2019 11:19

да, я протестировал код, который вы написали в сообщении, но не добавил к нему код фокуса. позволь мне попробовать

Maria 04.01.2019 11:24

На самом деле этот ответ и есть ответ на ваш вопрос. Главное окно доступно все время, а W1 недоступен, пока W2 не открыт. По поводу стайлинга - это другой вопрос, шире. Для людей с ограниченными возможностями вы все еще можете дополнительно использовать W1.IsEnabled = false; и обработчик событий W1.IsEnabled = true;.

Rekshino 04.01.2019 11:33

Рассмотрим 3 окна w1, w2, w3. W1 и W2 показаны изначально. И из W1 вы вызываете W3.ShowDialog(), это отключит как w1, так и w2, поскольку они оба работают в одном потоке пользовательского интерфейса. Я считаю, что вам нужно отключить только один из w1 или w2. (В этом случае допустим, что вы хотите включить w2 и отключить w1)

для этого вам нужно запустить w2 из другого потока с поведением STA, таким образом это предотвратит отключение w2

Thread newWindowThread = new Thread(new ThreadStart(ThreadStartingPoint));
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();



private void ThreadStartingPoint()
      {
         Window3 tempWindow = new Window3();
         tempWindow.Show();
         System.Windows.Threading.Dispatcher.Run();
      }

Другие вопросы по теме