Wpf window child windows

Blank WPF child windows on Windows 10

I have Windows 10 upgraded from Windows 8.1 (64 bit). In WPF applications (developed by me or by others, like todotxt.net on the screenshots) child windows are blank most of the time.

If I move a mouse over the controls, some of them appear (I guess because they handle WM_MOUSEHOVER message to repaint themselves). Sometimes windows are OK (

10-20% of launches). I have temporarily fixed the issue by hiding and showing the controls (please read below).

Fresh installation of Windows 10 on Hyper-V does not reproduce the error.

Has anyone faced with the similar issue? How have you solved it?

Here how it looks (blank child window):

After mouse move:

My solution

I was not able to find any other solution on the Internet. If you find any other solution, please let me know.

First, simple repainting (via InvalidateVisual()) did not solve the problem.

I decided to handle the ContentRendered event and hide and then show back all the controls. The trick works, but it «smells«.

In the code below mainGrid is a name of the topmost Grid of my child window:

2 Answers 2

From my observation, this is an Intel GPU driver issue on Windows 10 only (windows 8 were fine). We have a WPF desktop application with thousands of users that runs well in Windows 7, 8, 8.1 but when installed in Windows 10, some of the Windows 10 are working well but some will appear exactly what this thread explains.

To resolve this issue, the simplest method is to update the Intel GPU driver of the problematic machine. If you are desperately finding it doesn’t help even you have run the latest Windows updates and the problem still persists, try to update the driver manually by:

  1. In «Device Manager», right click the Graphic card and choose «update driver».
  2. In this way, windows 10 will try to look for the latest driver that sometimes not available in Windows Updates.
  3. If the device manager tell that your driver is up to date already, the last resort is to look for the driver here: https://downloadcenter.intel.com/

For some machine, e.g. Microsoft Surface 3 (not surface pro) that running kinda new CPU/GPU (Atom X7), update driver seems not possible yet and I am still finding resolution for this kind of machines.

In other cases, most of my Intel HD GPU solved this problem after updating to driver version 10.18.15.4278

Note 1: I have not seen this problem appear in other GPU, so far, say Nvidia or ATI. Note 2: In general, i would say, other than the latest Intel Atom X5/X7, most of the other Intel HD Graphic should be able to perform driver update and get this problem solved.

C# — Return variable from child window to parent window in WPF

I have a main window called form1. in form1 I have a button, when it is pressed it will open form2 (form2.ShowDialog()). In form2 I have a button called «Check». When the user clicks on «Check» it should do some validation and if successful creates a string object and return it to form1. Any Ideas on how to implement this? I don’t want to return anything when the user closes the window.

3 Answers 3

Create an event in your second window, have the parameters of the event’s delegate contain whatever information you want to pass:

Then the main window can subscribe to that event to do what it wants with the information:

This answer while not perfectly on target will be more useful to people that google themselves here for the general solution of how to communicate between windows:

There is no reason at all to set up events to access objects of the Main Window of you application. You can simply call them on the popup code and be done with it:

Читайте также:  Рябь экрана при установке windows

This could be accomplished in several ways. The method Servy posted is quite good and will accomplish what you need. I would prefer to see the Action passed as a parameter to the constructor and named callback so it’s clear what it is used for, but that’s just a preference thing.

The other method that is pretty good at getting this done is via Messaging. The MVVMLight Toolkit provides a great little feature in it for accomplishing tasks such as this.

Step 1: create a strongly typed Message:

Step 2: Determine where, and when to publish that message.

Setp 3: Now that you are sending the message, you need to be able to receive that message:

Wpf window child windows

Ключевым элементом в системе графического интерфейса в WPF является окно, которое содержит все необходимые элементы управления. Окно в WPF представлено классом Window , который является производным от класса ContentControl. Поэтому окно является элементом управления содержимым, и как, к примеру, кнопка, может содержать в себе один дочерний элемент. Как правило, в его качестве выступает один из элементов компоновки, например, Grid.

Класс Window привносит ряд свойств, которые позволяют настроить окно приложения:

AllowsTransparency : при значении true позволяет установить прозрачный фон окна

Icon : представляет иконку, которая отображается в левом верхнем углу окна и в панели задач. Если иконка не установлена, то система будет использовать стандартную иконку по умолчанию.

Top : устанавливает отступ окна приложения от верхней границы экрана

Left : устанавливает отступ окна приложения от левой границы экрана

ResizeMode : задает режим изменения размеров окна. Может принимать следующие значения:

CanMinimize : окно можно только свернуть

NoResize : у окна нельзя изменить начальные размеры

CanResize : у окна можно изменять размеры

CanResizeWithGrip : в правом нижнем углу окна появляется визуализация того, что у окна можно изменять размеры

RestoreBounds : возвращает границы окна

ShowInTaskbar : при значении true иконка окна отображается на панели задач

SizeToContent : позволяет автоматически масштабировать размеры окна в зависимости от содержимого. Может принимать следующие значения:

Width : автоматически масштабируется только ширина

Height : автоматически масштабируется только высота

WidthAndHeight : автоматически масштабируются высота и ширина

Manual : автоматическое масштабирование отсутствует

Title : заголовок окна

Topmost : при значении true окно устанавливается поверх других окон приложения

WindowStartupLocation : устанавливает стартовую позицию окна. Может принимать следующие значения:

CenterOwner : если данное окно было запущено другим окном, то данное окно позиционируется относительно центра запустившего его окна

CenterScreen : окно помещается в центре экрана

Manual : позиция устанавливается вручную с помощью свойств Top и Left

WindowState : состояние окна. Возможные значения:

Maximized : раскрыто на весь экран

Normal : стандартное состояние

Жизненный цикл

В процессе работы окно в WPF проходит ряд этапов жизненного цикла, которые доступны нам через обработку событий класса Window:

Initialized : это событие возникает при инициализации окна, когда у него устанавливаются все свойства, но до применения к нему стилей и привязки данных. Это общее событие для всех элементов управления в WPF, поэтому следует учитывать, что сначала возникают события вложенных элементов, а затем их контейнеров. То есть событие Initialized окна приложения генерируется только после того, как отработает событие Initialized для всех вложенных элементов.

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

Closing : возникает при закрытии окна

Closed : возникает, когда окно становится закрытым

Unloaded : возникает после закрытия окна при выгрузке всех связанных ресурсов из памяти

Соответственно, если нам надо выполнить некоторые действия при загрузке или при закрытии окна, мы можем обработать события Loaded и Closing/Closed. Например, запишем в текстовый лог события жизненного цикла:

Wpf window child windows

Ключевым элементом в системе графического интерфейса в WPF является окно, которое содержит все необходимые элементы управления. Окно в WPF представлено классом Window , который является производным от класса ContentControl. Поэтому окно является элементом управления содержимым, и как, к примеру, кнопка, может содержать в себе один дочерний элемент. Как правило, в его качестве выступает один из элементов компоновки, например, Grid.

Читайте также:  Windows store не обновляется

Класс Window привносит ряд свойств, которые позволяют настроить окно приложения:

AllowsTransparency : при значении true позволяет установить прозрачный фон окна

Icon : представляет иконку, которая отображается в левом верхнем углу окна и в панели задач. Если иконка не установлена, то система будет использовать стандартную иконку по умолчанию.

Top : устанавливает отступ окна приложения от верхней границы экрана

Left : устанавливает отступ окна приложения от левой границы экрана

ResizeMode : задает режим изменения размеров окна. Может принимать следующие значения:

CanMinimize : окно можно только свернуть

NoResize : у окна нельзя изменить начальные размеры

CanResize : у окна можно изменять размеры

CanResizeWithGrip : в правом нижнем углу окна появляется визуализация того, что у окна можно изменять размеры

RestoreBounds : возвращает границы окна

ShowInTaskbar : при значении true иконка окна отображается на панели задач

SizeToContent : позволяет автоматически масштабировать размеры окна в зависимости от содержимого. Может принимать следующие значения:

Width : автоматически масштабируется только ширина

Height : автоматически масштабируется только высота

WidthAndHeight : автоматически масштабируются высота и ширина

Manual : автоматическое масштабирование отсутствует

Title : заголовок окна

Topmost : при значении true окно устанавливается поверх других окон приложения

WindowStartupLocation : устанавливает стартовую позицию окна. Может принимать следующие значения:

CenterOwner : если данное окно было запущено другим окном, то данное окно позиционируется относительно центра запустившего его окна

CenterScreen : окно помещается в центре экрана

Manual : позиция устанавливается вручную с помощью свойств Top и Left

WindowState : состояние окна. Возможные значения:

Maximized : раскрыто на весь экран

Normal : стандартное состояние

Жизненный цикл

В процессе работы окно в WPF проходит ряд этапов жизненного цикла, которые доступны нам через обработку событий класса Window:

Initialized : это событие возникает при инициализации окна, когда у него устанавливаются все свойства, но до применения к нему стилей и привязки данных. Это общее событие для всех элементов управления в WPF, поэтому следует учитывать, что сначала возникают события вложенных элементов, а затем их контейнеров. То есть событие Initialized окна приложения генерируется только после того, как отработает событие Initialized для всех вложенных элементов.

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

Closing : возникает при закрытии окна

Closed : возникает, когда окно становится закрытым

Unloaded : возникает после закрытия окна при выгрузке всех связанных ресурсов из памяти

Соответственно, если нам надо выполнить некоторые действия при загрузке или при закрытии окна, мы можем обработать события Loaded и Closing/Closed. Например, запишем в текстовый лог события жизненного цикла:

Класс Window

Класс Window унаследован от класса ContentControl. Это означает, что он может содержать только одного потомка (каковым обычно является контейнер компоновки наподобие элемента управления Grid) и что его фон можно закрашивать с помощью кисти путем установки свойства Background.

Можно еще также использовать и свойства BorderBrush и BorderThickness для добавления вокруг окна границы, но эта граница добавляется внутри оконной рамки (то есть по краю клиентской области). Оконную рамку можно вообще удалять путем установки для свойства WindowStyle значения None, что позволяет создавать полностью настраиваемое (т.е. имеющее специальную форму) окно.

— это область внутри окна. Именно в ней размещается содержимое. К не клиентской области относится граница и строка заголовка в верхней части окна. За управление этой областью отвечает операционная система.

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

AllowsTransparency

Если установлено в true, класс Window позволяет другим окнам «проглядывать» через данное при условии, что для фона был установлен прозрачный цвет. В случае установки в false (поведение по умолчанию), находящееся позади данного окна содержимое не «просматривается», и прозрачный цвет фона визуализируется как черный. В случае использования в комбинации со свойством WindowsStyle, установленным в None, это свойство позволяет создавать окна, имеющие необычную форму.

Читайте также:  Jakarta unified client windows 10

Icon

Объект imageSource, идентифицирующий значок, который должен использоваться для данного окна. Значки отображаются в левом верхнем углу окна (если в нем применяется один из стандартных стилей границ), в панели задач (если свойство ShowInTaskBar установлено в true) и в окне выбора, которое появляется, когда пользователь нажимает комбинацию клавиш для перехода между работающими приложениями. Поскольку эти значки имеют разные размеры, в используемом для них файле .ico должны содержаться изображения с размерами как минимум 16×16 и 32×32 пикселя.

В последних версиях ОС Windows (Windows Vista и Windows 7) добавлен новый стандарт для значков 48×48 и 256×256 пикселей, размер которых можно изменять. Если свойство Icon установлено в null, окно получает тот же значок, что и приложение (значок для которого можно указать в Visual Studio, дважды щелкнув на узле Properties (Свойства) в окне Solution Explorer и перейдя на вкладку Application (Приложение)). Если свойство вообще опущено, WPF для изображения окна будет использовать стандартный, но непримечательный значок

Тор и Left

Определяют расстояние между левым верхним углом окна и левыми верхними краями экрана (в независимых от устройства единицах). При изменении любого из них генерируется событие LocationChanged. Если свойство WindowStartupPosition установлено в Manual, значения этих свойств можно указывать до появления окна для определения, задавая его начальную позицию. Какое бы значение не использовалось для WindowStartupPosition, эти свойства можно устанавливать в любой момент после отображения окна, изменяя его текущую позицию

ResizeMode

Принимает значение перечисления ResizeMode, которое определяет, может ли пользователь изменять размеры окна. Также влияет на видимость кнопок, отвечающих за разворачивание и сворачивание окна. Чтобы полностью заблокировать размеры окна, используйте значение NoResize. Чтобы пользователь мог только сворачивать окно, применяйте значение CanMinimize. Чтобы пользователь мог изменять размер окна всеми возможными способами, указываете значение CanResize. Чтобы в правом нижнем углу окна отображалась еще и визуальная подсказка, указывающая, что размеры окна разрешено изменять, задавайте значение CanResizeWithGrip.

RestoreBounds

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

ShowInTaskBar

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

SizeToContent

Позволяет создать окно, которое автоматически увеличивается в соответствии с размерами содержимого. Это свойство принимает значение перечисления SizeToContent. Чтобы отключить автоматическое изменение размеров окна, используйте значение Manual. Чтобы окно могло увеличиваться в различных направлениях в соответствии с размерами динамического содержимого, применяйте, соответственно, значение Height, Width или WidthAndHeight. При установке значения SizeToContent окно может увеличиваться в размерах в соответствии с содержимым так, что будет выходить за пределы экрана.

Title

Заголовок, который отображается в строке заголовка окна (и в панели задач)

Topmost

Если установлено в true, окно всегда отображается поверх остальных окон в приложении (если только у них это свойство также не равно true). Такая настройка очень удобна для палитр, которые обычно должны «плавать» над другими окнами

WindowStartupLocation

Принимает значение перечисления WindowStartupLocation. Для размещения окна в конкретной позиции с помощью свойств Left и Тор используйте значение Manual. Для размещения окна по центру экрана применяйте значение CenterScreen. Для размещения окна с учетом позиции того окна, которое его запустило, указывайте значение CenterOwner. При отображении немодального окна с использованием значения CenterOwner удостоверьтесь, что свойство Owner нового окна установлено перед тем, как показывать его.

WindowState

Принимает значение перечисления WindowState. Информирует о том, в каком состоянии находится окно: развернутом, свернутом или обычном (и позволяет изменить его). При изменении значения этого свойства генерируется событие StateChanged

WindowStyle

Принимает значение перечисления WindowStyle, которое определяет внешний вид границы окна. Возможные значения: SingleBorderWindow (по умолчанию), ThreeDBorderWindow (граница визуализируется несколько иным образом в Windows ХР), ToolWindow (отображается тонкая граница, удобная для «плавающих» окон с инструментами без кнопок сворачивания и разворачивания) и None (визуализируется очень тонкая приподнятая граница без области для строки заголовка). Увидеть разницу можно на рисунке ниже:

Оцените статью