У меня есть приложение, в котором есть окно (скажем, W1), я хочу, чтобы оно не блокировало обработку приложения, пока оно открыто. Я добился этого с помощью W1.show(). Из этого окна открывается еще одно окно (W2).
Я хочу, чтобы его поведение было чем-то вроде модального, чтобы отключить родительское окно W1, за исключением того, что не должен отключит оставшееся приложение.
Короче: когда W2 открыт
приложение продолжает свою работу
только W1 отключается
Я пытался
W1.IsEnabled = false;
W2.Show();
W1.IsEnabled = true;
он перемещает фокус на W2, когда он открывается, и оставшееся приложение также продолжает свою работу, но я все еще могу использовать W1, что неверно
Если я использую
W2.ShowDialog()
тогда все приложение блокируется. Есть ли какой-то метод, с помощью которого можно отключить только родительское окно (/ владелец)?
Это может быть вариантом, если у меня нет другого решения, кроме 1) в нем слишком много элементов управления 2) попытки щелкнуть по нему не должны перемещать фокус на него (как при открытии модального окна).
Какие операции нужно продолжать?
на самом деле это приложение для проектирования. Пользователь должен иметь возможность продолжить проектирование в главном окне (не в W1).





Это должно ответить на ваш вопрос:
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 должен дать тот же эффект / анимацию, который мы получаем, когда мы открываем / сохраняем поскольку диалог открывается в разных приложениях, и мы пытаемся использовать главное окно
Не рядом со мной. Убедитесь сами: W1.GotFocus += W1_GotFocus;. Вы сделали это, как я написал, с обработчиком событий Closing ??
да, я протестировал код, который вы написали в сообщении, но не добавил к нему код фокуса. позволь мне попробовать
На самом деле этот ответ и есть ответ на ваш вопрос. Главное окно доступно все время, а W1 недоступен, пока W2 не открыт. По поводу стайлинга - это другой вопрос, шире. Для людей с ограниченными возможностями вы все еще можете дополнительно использовать W1.IsEnabled = false; и обработчик событий W1.IsEnabled = true;.
Рассмотрим 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();
}
Какие операции в w1 ... отключите вручную с помощью IsEnabled и снова включите его, когда w2 был закрыт.