отключить только окно владельца в wpf - PullRequest
0 голосов
/ 04 января 2019

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

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

Короче говоря: при открытии W2

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

  • только W1 получаетотключено

Я пытался

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

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

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

W2.ShowDialog()

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

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Рассмотрим 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();
      }
0 голосов
/ 04 января 2019

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

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...