Как я определяю, модально ли окно WPF?

Ошибка синтаксиса: ошибка синтаксиса, неожиданный T_ENCAPSED_AND_WHITESPACE

Эта ошибка чаще всего встречается при попытке ссылаться на значение массива с помощью ключевого слова для интерполяции внутри строки с двумя кавычками , когда вся конструкция комплексной переменной не заключена в {}.

Случай ошибки:

Это приведет к Unexpected T_ENCAPSED_AND_WHITESPACE:

echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^

Возможные исправления:

В строке с двойными кавычками PHP разрешает использовать строки ключей ключей без кавычек и не выдаст E_NOTICE. Таким образом, вышесказанное может быть записано как:

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^

Вся сложная переменная массива и ключ (ы) могут быть заключены в {}, и в этом случае они должны быть указаны чтобы избежать E_NOTICE. Документация PHP рекомендует этот синтаксис для сложных переменных.

echo "This is a double-quoted string with a quoted array key in {$array['key']}";
//--------------------------------------------------------------^^^^^^^^^^^^^^^
// Or a complex array property of an object:
echo "This is a a double-quoted string with a complex {$object->property->array['key']}";

Конечно, альтернатива любой из вышеперечисленного заключается в объединении переменной массива in вместо интерполировать его:

echo "This is a double-quoted string with an array variable " . $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

Для справки см. раздел «Переменная синтаксический анализ» в странице руководства PHP Strings

29
задан Maslow 11 October 2018 в 14:35
поделиться

7 ответов

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

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

29
ответ дан Nash 28 November 2019 в 01:10
поделиться

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

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

Dim frm As New Window2
frm.ShowDialog()

В моем Window2 I, затененном 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

В моем событии Loaded, я тогда исчерпал окно сообщения, чтобы удостовериться, что свойство IsModal было изменено от Лжи до Истинного, и это дает мне Правда, таким образом, я знаю, что IsModal был установлен. MyBase. ShowDialog () тогда вынуждает базовый класс быть загруженным как Модальный. Тени позволяют нам переопределять поведение по умолчанию даже при том, что ShowDialog () метод не был объявлен как переопределяемый.

, В то время как это не делает "сам, решают, что" это не требует, чтобы Вы передали в любом булевом значении снаружи и не требует, чтобы Вы установили IsModal снаружи, это устанавливает его в себе, это доступно снаружи, если Вы так приняли решение использовать его тот путь. Это устанавливает значение, только если это нас загруженное использование ShowDialog () метод и не при использовании Шоу () метод. Я сомневаюсь, что Вы найдете намного более простой метод выполнения этого.

4
ответ дан BenAlabaster 28 November 2019 в 01:10
поделиться

Используя Автоматизацию UI в 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 его через Автоматизацию.

0
ответ дан huseyint 28 November 2019 в 01:10
поделиться

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

Этот пример шоу, отображающие немодальное окно

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 28 November 2019 в 01:10
поделиться

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

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

-1
ответ дан Andy 28 November 2019 в 01:10
поделиться

Окно не позволяет Вам устанавливать значение для Окна. DialogResult, если окно не было открыто с помощью ShowDialog (). Следовательно, Вы могли бы попытаться установить Окно. DialogResult и видят, выдает ли это исключение.

-1
ответ дан 28 November 2019 в 01:10
поделиться

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

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

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

35
ответ дан 28 November 2019 в 01:10
поделиться
Другие вопросы по тегам:

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