Диалоговое окно «параметры» (visual studio)options dialog box (visual studio)

Содержание

Модальные на уровне приложения


Основная статья: Модальное окно

Модальным называется окно, которое блокирует работу пользователя с родительским приложением до тех пор, пока пользователь это окно не закроет. Диалоговые окна преимущественно реализованы модальными.

Например, модальными являются диалоговые окна настроек приложения — так как проще реализовать режим, когда все сделанные изменения настроек применяются или отменяются одномоментно, и с момента, когда пользователь решил изменить настройки приложения и открыл диалог настроек, и до момента, когда он новые настройки вводит в силу или отказывается от них, приложение ожидает решения пользователя.

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

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

Кнопки

Основная статья: Кнопка (элемент интерфейса программ)

Пример запроса подтверждения.

В диалоговых окнах многих программ присутствуют кнопки OK и Отмена (Cancel), нажимая первую из которых, пользователь выражает своё согласие с тем, что в этот момент отображает диалоговое окно, и тем самым закрывает его, приводя в действие сделанные в нём изменения, а вторая — закрывает окно без применения. Существуют варианты с единственной кнопкой ОК — в информирующих окнах, не подразумевающих каких-либо изменений, и с кнопками ОК, Применить (Apply) и Закрыть (Close), в окнах, результаты изменений в которых пользователь, по мнению автора программы, может оценить, не закрывая окна, и в случае неудовлетворительного результата продолжить внесение изменений.

Также хорошим тоном считается обеспечить в диалоговых окнах справочную систему — обычно это реализуется либо в виде кнопки Справка (Help), открывающей страницу документации, описывающую работу в этом диалоговом окне, либо (в Windows) с помощью кнопки со знаком вопрос в заголовке окна, нажав на которую, пользователь переключает мышь в режим одноразовой контекстной подсказки: нажатие мышью в этом режиме на элемент диалогового окна вызывает отображение описания этого элемента.

Другие стандартные диалоги

На этом занятии мы лишь рассмотрели примеры использования некоторых стандартных диалогов. Полный их список, можно посмотреть в документации wxPython. Для этого нужно зайти вот на эту страницу:

и здесь в списке подклассов как раз и будут приведены все типы стандартных диалогов. Использование их в программах аналогично рассмотренным ранее на этом занятии.

Видео по теме

wxPython #1: обзор модулей для GUI и порядок установки wxPython

wxPython #2: общая структура интерфейса

wxPython #3: создание меню и подменю — MenuBar, Menu, MenuItem, Bind, Append, AppendSeparator

wxPython #4: контекстное меню и панель инструментов (toolbar)

wxPython #5: схемы (layout) размещения виджетов, BoxSizer

wxPython #6: сайзеры — GridSizer, FlexGridSizer, GridBagSizer

wxPython #7: механизм обработки событий — Bind, Unbind

wxPython #8: примеры событий, назначение id виджетам

wxPython #9: стандартные диалоговые окна

wxPython #10: пользовательские диалоговые окна, класс Dialog

wxPython #11: базовые виджеты — StaticText, TextCtrl, Button, ToggleButton, CheckBox и другие

wxPython #12: продвинутая работа с виджетами — ListBox, SplitterWindow, HtmlWindow, Notebook

wxPython #13: графика — контекст устройства, Pen, Brush и градиентная заливка

wxPython #14: графические примитивы, система координат, единицы измерений

wxPython #15: регионы (wx.Region) и операции с ними

wxPython #16: буферизация графических данных — MemoryDC, Blit

wxPython #17: демонстрация программы wxFormBuilder

Стандартные элементы управления

Давайте разместим в нашем окне текстовое поле ввода и две кнопки «Да» и «Отмена». Класс MyDlg можно представить так:

class MyDlg(wx.Dialog):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.SetSize(500, 150)
 
        vb = wx.BoxSizer(wx.VERTICAL)
        vb.Add(wx.TextCtrl(self, wx.ID_ANY), flag=wx.EXPAND | wx.ALL, border=10)
 
        vh = wx.BoxSizer(wx.HORIZONTAL)
        bOk = wx.Button(self, wx.ID_ANY, label="Да", size=(100, 30))
        bCn = wx.Button(self, wx.ID_ANY, label="Отмена", size=(100, 30))
        vh.Add(bOk, flag=wx.LEFT, border = 10)
        vh.Add(bCn, flag=wx.LEFT, border=10)
 
        vb.Add(vh, flag=wx.ALIGN_CENTER|wx.ALL, border=10)
        self.SetSizer(vb)

Запустим нашу программу и смотрите, при нажатии на кнопки ничего не происходит, что, впрочем, ожидаемо, так как мы не назначали им никаких обработчиков. Если решать эту задачу «в лоб», то можно это реализовать так. На первую кнопку «Да» повесить обработчик onOk:

bOk.Bind(wx.EVT_BUTTON, self.onOk)

и реализовать его в следующем виде:

    def onOk(self, event): 
        self.EndModal(wx.ID_OK)

Смотрите, мы здесь вызываем метод EndModal класса Dialog, который завершает цикл выполнения диалогового окна и определяет возвращаемое значение в виде константы ID_OK. И, затем, переменная res в обработчике onDialog будет принимать это значение. То есть, мы можем сделать такую проверку:

            if res == wx.ID_OK:
                print("Нажата кнопка да")

Но это не лучший подход к обработке стандартных элементов управления в диалогах. Гораздо проще и удобнее у кнопки bOk прописать этот стандартный id:

bOk = wx.Button(self, wx.ID_OK, label="Да", size=(100, 30))

а назначение обработчика убрать. При запуске программы получим абсолютно такой же функционал для этой кнопки. По аналогии объявим и кнопку bCn:

bCn = wx.Button(self, wx.ID_CANCEL, label="Отмена", size=(100, 30))

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

Вот так создаются свои собственные диалоговые окна в wxPython.

Видео по теме

wxPython #1: обзор модулей для GUI и порядок установки wxPython

wxPython #2: общая структура интерфейса

wxPython #3: создание меню и подменю — MenuBar, Menu, MenuItem, Bind, Append, AppendSeparator


wxPython #4: контекстное меню и панель инструментов (toolbar)

wxPython #5: схемы (layout) размещения виджетов, BoxSizer

wxPython #6: сайзеры — GridSizer, FlexGridSizer, GridBagSizer

wxPython #7: механизм обработки событий — Bind, Unbind

wxPython #8: примеры событий, назначение id виджетам

wxPython #9: стандартные диалоговые окна

wxPython #10: пользовательские диалоговые окна, класс Dialog

wxPython #11: базовые виджеты — StaticText, TextCtrl, Button, ToggleButton, CheckBox и другие

wxPython #12: продвинутая работа с виджетами — ListBox, SplitterWindow, HtmlWindow, Notebook

wxPython #13: графика — контекст устройства, Pen, Brush и градиентная заливка

wxPython #14: графические примитивы, система координат, единицы измерений

wxPython #15: регионы (wx.Region) и операции с ними

wxPython #16: буферизация графических данных — MemoryDC, Blit

wxPython #17: демонстрация программы wxFormBuilder

Модуль filedialog – диалоговые окна открытия и сохранения файлов

Рассмотрим две функции из модуля filedialog – askopenfilename() и asksaveasfilename(). Первая предоставляет диалоговое окно для открытия файла, вторая – для сохранения. Обе возвращают имя файла, который должен быть открыт или сохранен, но сами они его не открывают и не сохраняют. Делать это уже надо программными средствами самого Python.

from tkinter import *
from tkinter import filedialog as fd
 
def insertText():
    file_name = fd.askopenfilename()
    f = open(file_name)
    s = f.read()
    text.insert(1.0, s)
    f.close()
 
def extractText():
    file_name = fd.asksaveasfilename(filetypes=(("TXT files", "*.txt"),
                                        ("HTML files", "*.html;*.htm"),
                                                ("All files", "*.*") ))
    f = open(file_name, 'w')
    s = text.get(1.0, END)
    f.write(s)
    f.close()
 
root = Tk()
text = Text(width=50, height=25)
text.grid(columnspan=2)
b1 = Button(text="Открыть", command=insertText)
b1.grid(row=1, sticky=E)
b2 = Button(text="Сохранить", command=extractText)
b2.grid(row=1, column=1, sticky=W)
 
root.mainloop()

Опция filetype позволяет перечислить типы файлов, которые будут сохраняться или открываться, и их расширения.

Примечание. В приведенном коде при размещении текстового поля методом grid() не указаны аргументы row и column. В таких случаях подразумевается, что их значениями являются нули.

Немодальные диалоговые окна

Немодальные (англ. modeless) диалоговые окна используются в случаях, когда выводимая в окне информация не является существенной для дальнейшей работы системы. Поэтому окно может оставаться открытым, в то время как работа пользователя с системой продолжается. Разновидностью немодального окна является панель инструментов или окно-«палитра», если она отсоединена или может быть отсоединена от главного окна приложения, так как элементы управления, расположенные на ней, могут использоваться параллельно с работой приложения. Впрочем, такие окна редко называют «диалоговыми».

В общем случае, правила хорошего программного дизайна предлагают использовать именно этот тип диалоговых окон, так как он не принуждает пользователя к определённой (возможно, не очевидной для него) последовательности действий. Примером может быть диалоговое окно для изменения каких-либо свойств текущего документа, например, цвета фона или текста. Пользователь может вводить текст, не обращая внимания на его цвет. Но в любой момент может изменить цвет, используя диалоговое окно. (Приведённый пример не обязательно является лучшим решением. Такую же функциональность может обеспечить и панель инструментов, расположенная в главном окне.)

Немодальные диалоговые окна

Немодальные (англ. modeless) диалоговые окна используются в случаях, когда выводимая в окне информация не является существенной для дальнейшей работы системы. Поэтому окно может оставаться открытым, в то время как работа пользователя с системой продолжается. Разновидностью немодального окна является панель инструментов или окно-«палитра», если она отсоединена или может быть отсоединена от главного окна приложения, так как элементы управления, расположенные на ней, могут использоваться параллельно с работой приложения. Впрочем, такие окна редко называют «диалоговыми».

В общем случае, правила хорошего программного дизайна предлагают использовать именно этот тип диалоговых окон, так как он не принуждает пользователя к определённой (возможно, не очевидной для него) последовательности действий. Примером может быть диалоговое окно для изменения каких-либо свойств текущего документа, например, цвета фона или текста. Пользователь может вводить текст, не обращая внимания на его цвет. Но в любой момент может изменить цвет, используя диалоговое окно. (Приведённый пример не обязательно является лучшим решением. Такую же функциональность может обеспечить и панель инструментов, расположенная в главном окне.)

Как избавиться от ненужных диалоговых окон и всплывающих элементовWays to avoid using dialogs and flyouts

Учитывайте важность информации, которую требуется отобразить: важна ли она настолько, чтобы прерывать пользователя?Consider the importance of the information you want to share: is it important enough to interrupt the user? Также учтите частоту отображения информации. Если диалоговое окно или уведомление отображается каждые несколько минут, возможно, следует выделить для этой информации место в основном пользовательском интерфейсе.Also consider how frequently the information needs to be shown; if you’re showing a dialog or notification every few minutes, you might want to allocate space for this info in the primary UI instead

Возьмем, к примеру, клиент чата. Вместо того чтобы отображать всплывающий элемент каждый раз, когда друг выполняет вход, можно отображать список друзей, находящихся на данный момент в сети, и выделять друзей, выполняющих вход.For example, in a chat client, rather than showing a flyout every time a friend logs in, you might display a list of friends who are online at the moment and highlight friends as they log on.

Диалоговые окна часто используются для подтверждения действия (например, удаления файла) перед его выполнением.Dialogs are frequently used to confirm an action (such as deleting a file) before executing it. Если ожидается, что пользователь будет часто выполнять определенное действие, вы можете предоставить пользователю возможность отменить ошибочное действие, чем запрашивать его подтверждение каждый раз.If you expect the user to perform a particular action frequently, consider providing a way for the user to undo the action if it was a mistake, rather than forcing users to confirm the action every time.

Немодальные диалоговые окна

Немодальные (англ. modeless) диалоговые окна используются в случаях, когда выводимая в окне информация не является существенной для дальнейшей работы системы. Поэтому окно может оставаться открытым, в то время как работа пользователя с системой продолжается. Разновидностью немодального окна является панель инструментов или окно-«палитра», если она отсоединена или может быть отсоединена от главного окна приложения, так как элементы управления, расположенные на ней, могут использоваться параллельно с работой приложения. Впрочем, такие окна редко называют «диалоговыми».

В общем случае, правила хорошего программного дизайна предлагают использовать именно этот тип диалоговых окон, так как он не принуждает пользователя к определённой (возможно, не очевидной для него) последовательности действий. Примером может быть диалоговое окно для изменения каких-либо свойств текущего документа, например, цвета фона или текста. Пользователь может вводить текст, не обращая внимания на его цвет. Но в любой момент может изменить цвет, используя диалоговое окно. (Приведённый пример не обязательно является лучшим решением. Такую же функциональность может обеспечить и панель инструментов, расположенная в главном окне.)

Модальные на уровне окна

Для смягчения недостатков модальных диалоговых окон (блокирование доступа к приложению, или, даже, к системе в целом) была предложена концепция модальности на уровне окна (или документа). Такой тип диалогового окна введён, например, в Mac OS X, где он называется «диалоговое модальное окно для документа» (англ. document modal sheet).

При появлении диалогового окна подобного типа работа с остальными окнами приложения не блокируется. Поскольку окно диалога не перекрывает родительское окно, а прикрепляется к нему, остаётся возможность изменять размеры и положение и самого родительского окна. При этом, естественно, содержимое родительского окна остаётся недоступным до закрытия модального диалогового окна.

Стилизация диалоговых окон

Давайте теперь посмотрим на различные способы стилизации диалоговых окон. И для начала вызовем окно со стандартными стилями:

with MyDlg(self, title="Мой диалог...", style=wx.CAPTION | wx.CLOSE_BOX | wx.SYSTEM_MENU) as dlg:

Далее, уберем стиль wx.CLOSE_BOX:

with MyDlg(self, title="Мой диалог...", style=wx.CAPTION | wx.SYSTEM_MENU) as dlg:

и смотрите, кнопка закрытия окна неактивна, окно можно закрыть лишь комбинацией клавиш Alt+F4.

Если убрать все стили:

with MyDlg(self, title="Мой диалог...", style=) as dlg:

то получим окно в виде вот такого полотна. Его также можно закрыть комбинацией клавиш Alt+F4.


Добавим туда wx.CAPTION, wx.CLOSE_BOX и еще wx.RESIZE_BORDER:

with MyDlg(self, title="Мой диалог...", style=wx.CAPTION | wx.CLOSE_BOX | wx.RESIZE_BORDER) as dlg:

Теперь наше окно можно менять в размерах. И так далее, комбинируя стили различным образом можно получать окна с разными свойствами.

Как закрыть диалоговое окно

На вашем экране есть диалоговое окно, которое не хочет исчезать, и вам бы хотелось от него избавиться? Есть несколько способов, которые вы можете предпринять, чтобы убрать его.

Действия

Создатель программы хочет убедиться, что пользователь осознает последствия того, что может предпринять действие, и что вы знаете, что процесс отменяет изменение (если они случайно завершены).

2. Ответьте на диалоговое окно

Нажмите кнопку «ОК» или «Отмена / Закрыть» в диалоговом окне. Традиционно, закрывая их, можно щелкнуть один из ящиков.

3. Закройте диалоговое окно с помощью альтернативных кнопок

Нажмите кнопку x в правом верхнем углу диалогового окна, которое вы хотите закрыть. Нажатие этой кнопки должно закрыть окно и заставить его исчезнуть. Однако иногда это может привести к тому, что вместо этого откроются альтернативные другие окна.

Щелкните правой кнопкой мыши значок, ссылающийся на диалоговое окно на панели задач Windows, и нажмите «Закрыть». Опять же, вы можете оказаться вместе с другими, сделав это, но это диалоговое окно исчезнет.

5. Используйте Диспетчер задач в Windows

(если вы используете их на ПК с ОС Windows). Откройте Диспетчер задач в Windows (со вкладки «Приложения»), выделите строку в диалоговом окне и нажмите «Завершить задачу». Если диалоговое окно является упрямым, вам может потребоваться сделать это несколько раз (без нажатия «Завершить задачу», чтобы это диалоговое окно полностью исчезло).

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

7. Сохраните свою работу

(если программа по-прежнему позволяет вам, так как некоторые программы работают в фоновом режиме вдали от диалогового окна) и перезапустите всю систему с нуля. Удерживайте кнопку питания в течение 30 секунд. Отпустите, дайте компьютеру остыть и перезагрузите компьютер через 30-60 секунд.

Советы

iOS (iPhone, iPod touch и iPads) редко отображаются диалоговые окна. Когда они это сделают, у вас будет только возможность ответить на вопрос и нажать «ОК». Если поле не применяется, нажмите кнопку «Отмена».

  • Если вы когда-нибудь получите диалоговое окно, в котором говорится, что на вашем компьютере возникают проблемы с вредоносным ПО из программы, которую вы не узнаете, вам придется закрыть ее.
  • Однако никогда не нажимайте ни одной из кнопок. Идите прямо в диспетчер задач и завершите задачу этой кнопки непосредственно перед выполнением любых других задач на вашем компьютере.

Модальные на уровне окна

Для смягчения недостатков модальных диалоговых окон (блокирование доступа к приложению, или, даже, к системе в целом) была предложена концепция модальности на уровне окна (или документа). Такой тип диалогового окна введён, например, в Mac OS X, где он называется «диалоговое модальное окно для документа» (англ. document modal sheet).

При появлении диалогового окна подобного типа работа с остальными окнами приложения не блокируется. Поскольку окно диалога не перекрывает родительское окно, а прикрепляется к нему, остаётся возможность изменять размеры и положение и самого родительского окна. При этом, естественно, содержимое родительского окна остаётся недоступным до закрытия модального диалогового окна.

wx.FontDialog

Следующий диалог служит для выбора шрифта:

FontDialog(parent, data)

Им можно воспользоваться вот так:

        dlg = wx.FontDialog(self)
        res = dlg.ShowModal()
        if res == wx.ID_OK:
            font = dlg.GetFontData().GetChosenFont() #wx.Font
            print(font.GetFaceName())

Смотрите, чтобы получить данные выбранного шрифта, мы сначала вызываем метод GetFontData, который возвращает класс wx.FontData и уже с помощью метода GetChosenFont класса FontData мы получаем ссылку на выбранный шрифт. Далее, с помощью функции print в консоль выводим имя выбранного шрифта.

Документацию по данному диалоговому классу можно посмотреть на странице:

Модальные на уровне окна

Для смягчения недостатков модальных диалоговых окон (блокирование доступа к приложению, или, даже, к системе в целом) была предложена концепция модальности на уровне окна (или документа). Такой тип диалогового окна введён, например, в Mac OS X, где он называется «диалоговое модальное окно для документа» (англ. document modal sheet).

При появлении диалогового окна подобного типа работа с остальными окнами приложения не блокируется. Поскольку окно диалога не перекрывает родительское окно, а прикрепляется к нему, остаётся возможность изменять размеры и положение и самого родительского окна. При этом, естественно, содержимое родительского окна остаётся недоступным до закрытия модального диалогового окна.

Об этой статье

wikiHow работает по принципу вики, а это значит, что многие наши статьи написаны несколькими авторами. При создании этой статьи над ее редактированием и улучшением работали, в том числе анонимно, 15 человек(а). Количество просмотров этой статьи: 3502.

Категории: Компьютеры и электроника

English:Exit out of a Frozen Computer Program

Português:Sair de um Programa Travado

Deutsch:Ein eingefrorenes Computerprogramm beenden

Français:arrêter un programme qui ne répond pas

Bahasa Indonesia:Menutup Program Komputer yang Macet

Italiano:Chiudere un Programma Bloccato

Nederlands:Een vastgelopen programma stoppen

العربية:إغلاق برنامج لا يستجيب على الكمبيوتر

中文:退出无响应的程序

Tiếng Việt:Thoát khỏi chương trình máy tính bị treo


Печать

Общие диалоговые окна

Операционная система Windows включает много встроенных диалоговых окон, доступ к которым можно получать через API-интерфейс Windows. Для некоторых из них WPF предоставляет классы-оболочки.

Существует веская причина того, что WPF не включает упаковщики для абсолютно всех API-интерфейсов Windows. Одной из задач WPF является отделение от Windows API для получения возможности использования в других средах (например, в браузере) или переноса на другие платформы. Также многие из встроенных диалоговых окон уже начинают устаревать и потому не должны применяться в современных приложениях. Вдобавок в версии Windows 7 предпочтение уже отдается использованию не диалоговых окон, а основанных на задачах панелей и навигации.

Наиболее приметным из этих классов является класс System.Windows.MessageBox, который предоставляет статический метод Show(). Этот код можно использовать для отображения стандартных окон сообщений Windows. Ниже показана наиболее распространенная перегруженная версия этого метода:

Перечисление MessageBoxButton позволяет выбирать кнопки, которые должны отображаться в окне сообщений. К числу доступных вариантов относятся OK, OKCancel, YesNo и YesNoCancel. (Менее удобный для пользователя вариант AbortRetrylgnore не поддерживается.) Перечисление MessageBoxImage позволяет выбирать пиктограмму для окна сообщения (Information, Exclamation, Error, Hand, Question, Stop и т.д.).

Для класса MessageBox в WPF предусмотрена специальная поддержка функций печати, подразумевающих использование класса PrintDialog, а также классов OpenFileDialog и SaveFileDialog в пространстве имен Microsoft.Win32.

Классы OpenFileDialog и SaveFileDialog получают дополнительные функциональные средства (часть из которых наследуются от класса FileDialog). Оба из них поддерживают строку фильтра, которая устанавливает разрешенные расширения файлов. Класс OpenFileDialog также предлагает свойства, которые позволяют проверять выбор пользователя (CheckFileExists) и предоставлять ему возможность выбирать сразу несколько файлов (Multiselect). Ниже показан пример кода, который отображает диалоговое окно OpenFileDialog и выбранные файлы в окне списка после закрытия этого диалогового окна:

Элементов, позволяющих выбирать цвета, указывать шрифт и просматривать папки, здесь нет (хотя при использовании классов System.Windows.Forms из .NET 2.0 они доступны).

В предыдущих версиях WPF классы диалоговых окон всегда отображали диалоговые окна в старом стиле Windows ХР. В WPF 4 они были обновлены и оснащены поддержкой Windows Vista и Windows 7. Это означает то, что при запуске приложения под управлением более новой версии Windows диалоговые окна будут автоматически отображаться в современном стиле.

Органы управления диалогового окна

Шаблон устанавливает позицию, ширину, высоту, стиль, идентификаторы и класс окна для каждого органа управления в диалоговом окне. Система создает каждый орган управления путем передачи их данных в функцию CreateWindowEx. Органы управления создаются по порядку, в котором они определены в шаблоне. Шаблон должен определять соответствующее число, тип и порядок органов управления, чтобы гарантировать, что пользователь сможет сделать ввод необходимых данных, чтобы завершить задачу, связанную с диалоговым окном.

Для каждого органа управления шаблон устанавливает значения стиля, которые определяют внешний вид и работу органа управления. Каждый орган управления — это дочернее окно и, поэтому, должно иметь стиль WS_CHILD. Чтобы гарантировать, что орган управления видимый, когда на экране показывается диалоговое окно, каждый орган управления должен иметь также и стиль WS_VISIBLE. Другие, обычно используемые стили окна — это WS_BORDER для органов управления, которые не обязательно имеют рамки, WS_DISABLED для органов управления, которые должны быть блокированы, когда создается первоначальное диалоговое окно и WS_TABSTOP и WS_GROUP для органов управления, к которым можно обращаться, используя клавиатуру. Стили WS_TABSTOP и WS_GROUP используются совместно с клавиатурным интерфейсом диалога, рассмотренным позже в этой главе.

Шаблон может также установить стили, специфические для класса окна органа управления. Например, шаблон, который определяет кнопку управления, должен дать ей стиль, такой как BS_PUSHBUTTON или BS_CHECKBOX. Система передает стили органов управления в оконную процедуру этого элемента через посредство сообщения WM_CREATE, разрешая процедуре приспосабливать внешний вид и работу органа управления.

Система преобразует значения координат позиции, размеры ширины и высоты из базовых единиц измерения диалогового окна в пиксели, перед передачей их в функцию CreateWindowEx. Когда система создает орган управления, она определяет диалоговое окно как родительское окно. Это означает, что система всегда воспринимает координаты позиции органа управления как рабочие координаты, относительно верхнего левого угла рабочей области диалогового окна.

Шаблон определяет класс окна для каждого органа управления. Обычно диалоговое окно содержит органы управления, принадлежащие предопределенным классам окна органов управления, такие как класс окна кнопки и поля редактирования. В этом случае, шаблон определяет класс окна путем присваивания соответствующего предопределенного значения атома класса. Когда диалоговое окно содержит орган управления, принадлежащий классу окна пользовательского органа управления, шаблон дает имя этому зарегистрированному классу окна или значение атома, в настоящее время связанного с этим именем.

Каждый орган управления в диалоговом окне должен иметь уникальный идентификатор для отличия его от других элементов управления. Органы управления отправляют информацию процедуре диалогового окна через посредство сообщения WM_COMMAND, так что идентификаторы органов управления необходимы процедуре, чтобы различать, какой орган управления отправил данное сообщение. Единственное исключение из этого правила — идентификаторы статических органов управления. Статические органы управления не требуют уникального идентификатора, поскольку они отправляются без сообщения WM_COMMAND.

Чтобы разрешить пользователю закрыть диалоговое окно, шаблон должен установить, по крайней мере, одну командную кнопку и присвоить ей идентификатор управления IDCANCEL. Чтобы разрешить пользователю выбирать между завершением и отменой задачи связанной с диалоговым окном, шаблон должен установить две командные кнопки. с надписями ОК и Отменить (Cancel), с управляющими идентификаторами IDOK и IDCANCEL, соответственно.

Шаблон устанавливает также и необязательный текст и данные для создания органа управления. Текст обычно предназначен для обозначения кнопок управления или установки начального содержания текста статического органа управления. Данные для создания — это один или несколько байтов данных, которые система передает оконной процедуре органа управления, когда элемент управления создается. Данные для создания полезны для органов управления, которые требуют дополнительной информации о их начальном содержании или стиле, чем это дается другими данными. Например, прикладная программа может использовать данные для создания, чтобы установить начальные параметры и диапазон управления полосой прокрутки.

Диалоговые окна

Последнее обновление: 21.03.2016

WPF поддерживает возможность создания модальных диалоговых окон. При вызове модальное окно блокирует доступ к родительскому окну, пока пользователь не закроет модальное окно.

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

Изменим интерфейс PasswordWindow:

<Window x:Class="WindowApp.PasswordWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WindowApp"
        mc:Ignorable="d"
        Title="Авторизация" SizeToContent="WidthAndHeight" WindowStartupLocation="CenterScreen">
    <Grid Margin="10">
        <Grid.RowDefinitions>
            <RowDefinition Height="20" />
            <RowDefinition Height="20" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <TextBlock>Введите пароль:</TextBlock>
        <TextBox Name="passwordBox" Grid.Row="1" MinWidth="250">Пароль</TextBox>

        <WrapPanel Grid.Row="2" HorizontalAlignment="Right" Margin="0,15,0,0">
            <Button IsDefault="True" Click="Accept_Click" MinWidth="60" Margin="0,0,10,0">OK</Button>
            <Button IsCancel="True" MinWidth="60">Отмена</Button>
        </WrapPanel>

    </Grid>
</Window>

Здесь определено текстовое поле для ввода пароля и две кнопки. Вторая кнопка с атрибутом будет выполнять роль отмены. А первая кнопка будет подтверждать ввод.

Для подтверждения ввода и успешного выхода из модального окна определим в файле кода PasswordWindow определим обработчик первой кнопки Accept_Click:

using System.Windows;

namespace WindowApp
{
    public partial class PasswordWindow : Window
    {
        public PasswordWindow()
        {
            InitializeComponent();
        }

        private void Accept_Click(object sender, RoutedEventArgs e)
        {
            this.DialogResult = true;
        }

        public string Password
        {
            get { return passwordBox.Text; }
        }

    }
}

Для успешного выхода из модального диалогового окна нам надо для свойства DialogResult установить значение . Для второй кнопки необязательно определять обработчик, так как у нее установлен атрибут , следовательно, ее нажатие будет эквивалентно результату . Этот же результат будет при закрытии диалогового окна на крестик.

Кроме того, здесь определяется свойство , через которое мы можем извне получить введенный пароль.

И изменим главную форму MainWindow, чтобы из нее запускать диалоговое окно. Во-первых, определим кнопку:

<Window x:Class="WindowApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WindowApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="250" Width="300">
    <Grid>
        <Button Width="100" Height="30" Content="Авторизация" Click="Login_Click" />
    </Grid>
</Window>

И определим обработчик для этой кнопки:

private void Login_Click(object sender, RoutedEventArgs e)
{
    PasswordWindow passwordWindow = new PasswordWindow();

    if(passwordWindow.ShowDialog()==true)
    {
        if(passwordWindow.Password=="12345678")
            MessageBox.Show("Авторизация пройдена");
        else
            MessageBox.Show("Неверный пароль");
    }
    else
    {
        MessageBox.Show("Авторизация не пройдена");
    }
}

В итоге при нажатии на кнопку будет отображаться следующее диалоговое окно:

И в зависимости от результатов ввода будет отображаться то или иное сообщение.

НазадВперед

ContentDialog в объектах AppWindow или XAML IslandContentDialog in AppWindow or Xaml Islands

По умолчанию диалоговые окна содержимого модально связаны с корневым объектом ApplicationView.By default, content dialogs display modally relative to the root ApplicationView. При использовании ContentDialog в объекте AppWindow или XAML Island необходимо вручную задать XamlRoot для диалогового окна, указав корень узла XAML.When you use ContentDialog inside of either an AppWindow or a XAML Island, you need to manually set the XamlRoot on the dialog to the root of the XAML host.

Для этого задайте для свойства XamlRoot элемента ContentDialog то же значение XamlRoot, что и у элемента, уже заданного в AppWindow или XAML Island, как показано ниже.To do so, set the ContentDialog’s XamlRoot property to the same XamlRoot as an element already in the AppWindow or XAML Island, as shown here.

Предупреждение

В потоке может существовать только один элемент ContentDialog одновременно.There can only be one ContentDialog open per thread at a time. Попытка открыть два элемента ContentDialogs породит исключение, даже если они пытаются открыться в отдельных объектах AppWindow.Attempting to open two ContentDialogs will throw an exception, even if they are attempting to open in separate AppWindows.


С этим читают