wpf определить тип диалогового окна? [Дубликат]

Если ваши радиокнопки настроены, например, исходный значок для переключателя был скрыт с помощью css display:none, чтобы вы могли создать свой собственный переключатель, тогда вы можете получить ошибку.

Чтобы исправить это, нужно заменить display:none на opacity:0

25
задан Micah 29 December 2008 в 22:55
поделиться

7 ответов

Из http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c95f1acb-5dee-4670-b779-b07b06afafff/

"System.Windows.Interop.ComponentDispatcher.IsThreadModal может сказать вам, если в настоящее время в вызывающем потоке работает модальный hwnd."

28
ответ дан Nash 19 August 2018 в 00:32
поделиться
  • 1
    Именно то, что я искал. Потрясающие! – Micah 12 March 2009 в 15:21
  • 2
    Работает не сразу после вызова ShowModal. Некоторые события по-прежнему не могут определить, модально ли ... – Matze 11 November 2010 в 11:21
  • 3
    Это не работает, если модальный диалог показывает это немодальное диалоговое окно! – MTR 3 September 2013 в 14:26
  • 4
    – Melbourne Developer 15 October 2018 в 01:59

Можно ли проверить родителя окна, чтобы узнать, отключен ли он? Я не уверен, что это можно сделать с помощью API-интерфейсов WPF или нет, но если вы еще ничего не получили HWND из окна WPF, получите его родителя через Win32 P / Invoke (или что-то еще), а затем проверьте, отключен или нет.

Определенно не чистый метод, но похоже, что он может работать.

-2
ответ дан Andy 19 August 2018 в 00:32
поделиться

Хорошо, так как моя последняя идея проголосовала, я доказал это. это работает - и я тестировал его в новом приложении WPF, поэтому я знаю, что он работает:

В моем основном событии Window (Window1) Loaded я сделал:

Dim frm As New Window2
frm.ShowDialog()

In мой Window2 Я затенял метод ShowDialog ()

Private _IsModal As Boolean = False 'This will be changed in the IsModal method

Public Property IsModal() As Boolean
  Get
    Return _IsModal
  End Get
  Set(ByVal value As Boolean)
    _IsModal = value
  End Set
End Property

Public Shadows Sub ShowDialog()
  IsModal = True
  MyBase.ShowDialog()
End Sub

В моем загруженном событии я затем уволил окно сообщения, чтобы убедиться, что свойство IsModal изменено с False на True, и оно дает мне True, поэтому я знаю, что IsModal установлен. Затем MyBase.ShowDialog () заставляет базовый класс загружаться как модальный. Shadows позволяет переопределить поведение по умолчанию, даже если метод ShowDialog () не был объявлен как переопределяемый.

Хотя он не «самостоятельно определяет», он не требует, чтобы вы передавали любое логическое значение извне, и не требует, чтобы вы устанавливали IsModal извне, он устанавливает его внутри себя, он доступен снаружи, если вы так решили использовать его таким образом. Он устанавливает значение только в том случае, если оно загружено с помощью метода ShowDialog (), а не при использовании метода Show (). Я сомневаюсь, что вы найдете гораздо более простой способ сделать это.

3
ответ дан BenAlabaster 19 August 2018 в 00:32
поделиться

Вот фрагмент конвертера, который полезен для скрытия элементов, когда окно вызывается методом ShowDialog:

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Window window = value as Window;
        if (window != null)
        {               
            var showingAsDialogFieldInfo = typeof(System.Windows.Window).GetField("_showingAsDialog",
                BindingFlags.NonPublic | BindingFlags.Instance);
            if ((bool) showingAsDialogFieldInfo.GetValue(window) == false)
            {
                return Visibility.Visible;
            }
        }
        return Visibility.Hidden;
    }
2
ответ дан bitbonk 19 August 2018 в 00:32
поделиться

Когда окно WPF является модальным диалогом, есть частное поле _showingAsDialog. Вы можете получить это значение через отражение и включить его в метод расширения:

public static bool IsModal(this Window window)
{
    return (bool)typeof(Window).GetField("_showingAsDialog", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(window);
}

Значение установлено в true, когда окно отображается как модальное (ShowDialog) и устанавливается на false после закрытия окна.

28
ответ дан CMerat 19 August 2018 в 00:32
поделиться
  • 1
    уродливый, но выполняет работу, приветствует ... – JobaDiniz 13 September 2017 в 13:48
  • 2
    Не элегантный, а способ обнаружить. Помните, что если вы обновите инфраструктуру .Net, Microsoft может попытаться изменить имя частных полей, таких как этот, поэтому ваш код может сломаться позже. – Tore Aurstad 8 June 2018 в 09:47

Используя UI Automation в Windows, я придумал что-то вроде этого:

void Window2_Loaded(object sender, RoutedEventArgs e)
{
    var hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle;
    var el = AutomationElement.FromHandle(hwnd);

    Object oPattern = null;

    if (el.TryGetCurrentPattern(WindowPattern.Pattern, out oPattern))
    {
        var pattern = oPattern as WindowPattern;

        this.Title = pattern.Current.IsModal.ToString();
    }
}

Но это кажется неработоспособным. Существует свойство IsModal http://msdn.microsoft.com/en-us/library/system.windows.automation.provider.iwindowprovider.ismodal.aspx должен быть правильный способ получить AutomationElement для окна и проверить, является ли свойство IsModal истинным с помощью Automation.

0
ответ дан huseyint 19 August 2018 в 00:32
поделиться

модальное окно прекратит обработку до тех пор, пока оно не будет закрыто.

В этом примере показано отображение немодального окна

dim f as myWindow
f.show
someOtherMethod()

В этом примере someOtherMethod запускается сразу после окна .

В этом примере показано отображение модального файла:

dim f as myWindow
f.showDialog
someOtherMethod()

В этом примере someOtherMethod () не будет работать до тех пор, пока метод ShowDialog не вернется (что означает, что модальный окно закрыто)

ИЗМЕНИТЬ из-за пояснения: переопределить ShowDialog и передать логическое значение.

dim f as MyWindow
f.ShowDialog(true)

, затем в окне

Public Function Shadows ShowDialog(myVar as boolean) As Boolean
    if myVar then ShowButtons()
    return mybase.ShowDialog()
End Function 
0
ответ дан Stephen Wrighton 19 August 2018 в 00:32
поделиться
  • 1
    +1 Я бы подумал, что для этого также необходимо использовать свойство IsModal (). – BenAlabaster 15 December 2008 в 18:03
Другие вопросы по тегам:

Похожие вопросы: