Я пишу модальный диалог в WPF. Как настроить окно WPF, чтобы не было кнопки закрытия? Я все еще хотел бы для егоWindowState
чтобы у него была нормальная строка заголовка.
Я обнаружил ResizeMode
, WindowState
и WindowStyle
, но ни одно из этих свойств не позволяет мне скрыть кнопку закрытия, но показать строку заголовка, как в модальных диалогах.
Ответы:
В WPF нет встроенного свойства, чтобы скрыть кнопку «Закрыть» в строке заголовка, но вы можете сделать это с помощью нескольких строк P / Invoke.
Сначала добавьте эти объявления в ваш класс Window:
Затем поместите этот код в
Loaded
событие окна :И вот вы здесь: больше нет кнопки «Закрыть». У вас также не будет значка окна с левой стороны строки заголовка, что означает отсутствие системного меню, даже если вы щелкнете правой кнопкой мыши на строке заголовка - все они будут объединены.
Обратите внимание, что Alt+ F4все равно закроет окно. Если вы не хотите, чтобы окно закрывалось до завершения фонового потока, вы также можете переопределить
OnClosing
и установитьCancel
значение true, как предложил Гейб.источник
SetWindowLongPtr
вместо этого.Я только что столкнулся с подобной проблемой, и решение Джо Уайта кажется мне простым и понятным. Я использовал его снова и определил как прикрепленное свойство Window
Тогда в XAML вы просто устанавливаете это так:
источник
Установите для
WindowStyle
свойства значение None, что будет скрывать поле управления вместе с заголовком. Не надо кернал звонков.источник
this.DragMove();
к немуMouseDown
событиеЭто не избавит от кнопки закрытия, но остановит того, кто закроет окно.
Поместите это в свой код за файлом:
источник
Window
который настроен как модальный диалог, повлияет наWindow
настройку егоDialogResult
свойства и может сделать его непригодным для использования. stackoverflow.com/questions/898708/cant-set-dialogresult-in-wpfЧтобы отключить кнопку закрытия, вы должны добавить следующий код в ваш класс Window (код был взят отсюда , отредактирован и немного переформатирован):
Этот код также отключает пункт закрытия в системном меню и запрещает закрывать диалог, используя Alt + F4.
Возможно, вы захотите закрыть окно программно. Просто звонить
Close()
не получится. Сделайте что-то вроде этого:источник
Я пытался ответить Вячеславу, так как мне нравится идея не удалять кнопку, а отключать ее, но по какой-то причине она не всегда работала: кнопка закрытия все еще была включена, но никаких ошибок вообще не было.
С другой стороны, это всегда работало (проверка ошибок пропущена):
источник
Window
метода расширения в моем проекте.Свойство для установки является =>
WindowStyle="None"
источник
Я просто добавляю свою реализацию ответа Джо Уайта используя поведение интерактивности (вам нужно сослаться на System.Windows.Interactivity).
код:
использование:
источник
Позвольте пользователю "закрыть" окно, но на самом деле просто скрыть его.
В событии OnClosing окна скройте окно, если оно уже видно:
Каждый раз, когда должен выполняться фоновый поток, повторно отображайте фоновое окно пользовательского интерфейса:
При завершении выполнения программы убедитесь, что все окна закрыты / могут быть закрыты:
источник
Итак, в значительной степени здесь ваша проблема. Кнопка закрытия в правом верхнем углу оконной рамы не является частью окна WPF, но она принадлежит той части оконной рамы, которая контролируется вашей ОС. Это означает, что для этого вам понадобится взаимодействие с Win32.
В качестве альтернативы, вы можете использовать noframe и предоставить свой собственный «фрейм» или вообще не иметь фрейма.
источник
Ниже приведено отключение кнопок закрытия и максимизации / минимизации, на самом деле кнопки не удаляются (но удаляются элементы меню!). Кнопки в строке заголовка отображаются в отключенном / сером состоянии. (Я не совсем готов взять на себя всю функциональность сам ^^)
Это немного отличается от решения Virgoss тем, что оно удаляет пункты меню (и конечный разделитель, если необходимо), а не просто отключает их. Он отличается от решения Joe Whites, поскольку не отключает все системное меню, поэтому в моем случае я могу держать кнопку и значок «Свернуть».
Код последующего также поддерживает отключение Maximize / Minimize кнопки , как, в отличие от кнопки Закрыть, удаление записи из меню не вызывает систему для отображения кнопки «отключены» , даже если удаление пунктов меню делает отключение функциональных кнопок.
Меня устраивает. YMMV.
Использование: Это должно быть сделано ПОСЛЕ инициализации источника. Хорошее место - использовать событие SourceInitialized окна:
Чтобы отключить функциональность Alt + F4, проще всего подключить событие отмены и использовать команду установки флага, когда вы действительно хотите закрыть окно.
источник
Код XAML
должно сработать
Редактировать - на данный момент эта тема показывает, как это можно сделать, но я не думаю, что Window имеет свойство получать то, что вы хотите, не теряя обычную строку заголовка.
Редактировать 2 В этой теме показывается, как это сделать, но вы должны применить свой собственный стиль к системному меню и показать, как вы можете это сделать.
источник
Попробуйте добавить событие закрытия в окно. Добавьте этот код в обработчик событий.
Это предотвратит закрытие окна. Это имеет тот же эффект, что и скрытие кнопки закрытия.
источник
Используйте это, измененный с https://stephenhaunts.com/2014/09/25/remove-the-close-button-from-a-wpf-window :
источник
Это не скрывает кнопку, но предотвратит продвижение пользователя, закрыв окно.
источник
свойства окна goto set
ты не получишь кнопки закрытия ...
источник
WindowStyle = "None"
- следите за своим синтаксисом. С другой стороны, это подход с использованием дробовика, который также удаляет строку заголовка, делая коробку уродливой и не имеющей заголовка, когда есть намного более совершенные способы справиться с этим (о чем свидетельствуют другие ответы), и является дублирующим ответом.Как указано в других ответах, вы можете использовать
WindowStyle="None"
для удаления строки заголовка в целом.И, как указано в комментариях к этим другим ответам, это предотвращает перетаскивание окна, поэтому его трудно переместить из исходного положения.
Однако вы можете преодолеть это, добавив одну строчку кода в конструктор в файле Code Behind окна:
Или, если вы предпочитаете лямбда-синтаксис:
Это делает все окно перетаскиваемым. Любые интерактивные элементы управления, присутствующие в окне, такие как кнопки, по-прежнему будут работать в обычном режиме и не будут действовать как дескрипторы перетаскивания для окна.
источник
После долгих поисков ответа на этот вопрос я разработал это простое решение, которым я поделюсь здесь в надежде, что оно поможет другим.
Я поставил
WindowStyle=0x10000000
.Это устанавливает
WS_VISIBLE (0x10000000)
иWS_OVERLAPPED (0x0)
значения для стиля окна. «Перекрытый» является необходимым значением для отображения строки заголовка и границы окна. УдаливWS_MINIMIZEBOX (0x20000)
,WS_MAXIMIZEBOX (0x10000)
иWS_SYSMENU (0x80000)
значение из моего значения стиля, все кнопки из заголовка были удалены, в том числе кнопки Закрыть.источник
WindowStyle
есть перечисление, значения которого не совпадают с константами Windows API; Приведение значения кWindowStyle
перечислению не будет работать. Чтобы быть уверенным, я проверил исходный код .NET в ILSpy; значение enum транслируется в Windows API в закрытой функцииCreateWindowStyle
, и если функция встречает неизвестноеWindowStyle
значение, оно просто применяетсяWindowStyle.None
. (Единственный способ состоит в том, чтобы использовать внутренние свойства_Style
и_StyleEx
использовать отражение, против чего я настоятельно рекомендую.)Используйте
WindowStyle="SingleBorderWindow"
, это скроет кнопки max и min из окна WPF.источник
close
кнопкиЕсли необходимо только запретить пользователю закрывать окно, это простое решение.
Код XAML:
IsCloseButtonEnabled="False"
источник