WPF Chromeless Window Multiple Monitor Issues - wpf

I created a WPF application that opens a second window with a window style of none. I have a thread that updates data on the chromeless window and I handle the left button down by calling DragMove to allow the window to be moved around. One monitor has 150% font scaling while the other has 200%.
If I drag the chromeless window to my second monitor, the size changes to be bigger or smaller and the updates from the background thread no longer update the UI. If I drag it back to the original monitor, the size restores and the updates resume.
If I change the style to a ToolWindow, everything works correctly; the size changes while the window is split between the monitors but corrects once moved completely and the UI updates continue. There is apparently something going on relative to moving a window around between monitors when it has a titlebar versus when it doesn't have one.
I have also noticed that without a titlebar, if after moving the window to the new monitor, I shake it causing the other windows to minimize, the window will then resize and updates will resume.
Has anyone seen this or know what I might try? If I can't find a fix then I assume I have to resort to some p-invoke magic to hide the titlebar of the tool window.

Related

WPF one app rendering affects other app renderings

I have come across a strange problem.
Basically my app has a primary and a secondary window, the latter is shown on the second monitor. The secondary window has a marquee text animation going 24/7. For the secondary window, I had created a seperate thread with its own Dispatcher, so that the primary window's UI thread could not affect it.
Now I found out, that whenever I moved a modal window on the primary window with the mouse, the movement was sluggish and the marquee text animation became jerky. So I figure, that despite the separtae UI threads, the rendering thread is still the same for the entire process.
My next step was to move the second window to it's very own executable (a seperate Visual Studio project). But even with both windows living in their own processes, still the marque text animation becomes jerky when I move a modal window around in the primary window?!?
How can one application affect another application's rendering so drasticaly?
How to overcome this issue?
I'm using Win 7 x64, Core i5, nVidia GTX 670, .NET 4.5.1.
Edit:
I tried creating a seperate application with Windows Forms, that had a single Label control moving like a marquee, albeit with a regular timer (interval 15ms).
In my main WPF application I launched the primary window without the secondary window and still, moving a modal window inside the primary window causes the marquee in WinForm app to lag and become jerky :S

How to detect which Window was selected when using Aero peek

I am not even sure how to ask this question...
I have a WPF app with a main window in full screen. It launches new windows in full screen and makes them a child of the main window upon some user interactions. If the user's machine only has a single monitor this child window is supposed to be the focus until closed. However, I have found that using Windows Aero if the user hovers over my application's taskbar icon a preview of both windows appear. This in itself is not an issue except if you try to select the main window of the app nothing happens because the child window is always on top but the peek functionality gives the illusion that the user can switch to the main window and it looks like a bug.
I would like to detect which window the user is selecting and, if it is the main window, simply close the child window. Alternatively I would like Aero to stop showing multiple windows if only one will work.
Anyone had any experience with this?

Custom Window Bar

I'm not sure that's the right way to say it, but what I want is to for my wpf main window to have it's own bar that will behave like a taskbar, and any children windows that will be open from the main one will be placed in that bar in a similar way like the taskbar works in windows - a rectangle showing the window name for example, on click it opens you the window, if you click minimize it will minimize it to the bar, and with some option, to get it out of the main window and move it to the real windows taskbar, with another option for putting it back in. The problem is I don't know if this is even possible, and I don't know the name of such an element, so if anyone can give me any tips I'll be really thankful.
I worked on an application years ago (.NET 3.0: first WPF release!) that did exactly that. We ran into a lot of issues getting it to work, but we were pretty successful in the end. One thing we didn't support was moving it to the Windows taskbar.
The best option would be to set an attached property on each Window. This would register a Window with your custom taskbar, so if you wanted to move the Window out of your custom bar, you'd set the property to false. Setting the property to true would add it to the collection of application windows, as well as register event handlers to track the state of the Window.
One of the major pain points for us was getting the Window animations correct. If you're not running in XP, this probably less of an issue, as the animations in Vista (or is it 7?) and above aren't really showing where a Window is going on minimize. In the end, we had to do a lot of low level Win32 (p/Invoke) work for this.
Take a look at AvalonDock and WPF MDI:
http://avalondock.codeplex.com/
http://wpfmdi.codeplex.com/

WPF Window that only shows in TaskBar

I'm not sure if what I want to do is appropriate, so I'll explain a little.
We've got a large application that takes a while to load. So we have a splash screen.
The Splash screen causes excessive load time on Remote Desktop (terminal server).
So to alleviate this, we want to hide the splash screen when loading on RDP.
But we still need to at least show the user that the application is loading.
So, I was thinking perhaps just show something in the Taskbar (not the system tray), as it will disappear once the application is fully loaded (and be replaced by the main form's Task icon).
However any WPF solution I've looked at, requires a visible form/window to go with the Taskbar status.
Is there any way of showing something in the Taskbar without showing a WPF window?
Or is there another way of showing application load status without something on the screen?
We had same problem.
On remote desktop, we did following steps...
We configured the Splash window to not allow resizing and have only Minimize and Close button.
We removed WindowStyle=None setting so that title bar of the Splash window appeared
We made the Splash window's width and height zero. This way all you see on screen is a small blue rectangle of the title bar with Text "Loading... Please Wait ..." and minimize and Close button.
We used Window's kernel calls to disable title bar's Close button too. This way user was not able to cancel the Splash window.
So all a user could do is to minimize or restore from taskbar.
When restored, all he sees is a title bar's blue rectangle with "Loading..." text. This way the window also claimed its place on the task bar but hid its splash animation and user is also aware that the splash screen is loading. For this you can also update the Title bar's text by appending more fullstops ...
Loading. Please Wait..
Loading. Please Wait...
Loading. Please Wait....
Loading. Please Wait..
I do think you need to look into the root cause of your issue. Possibly looking at threading and parallelism.
However, a simple solution to what you are asking would be to just create a hidden window. One that is transparent, no borders or anything. It could even bet set to a size of 0, 0. That way you would be able to get the taskbar item that you require.

Strange "frozen" content of WPF Window bug

A few of my users are experiencing a strange bug. I have a simple WPF window that contains a few textblocks and buttons. After a short time using my application successfully the users that experience the problem report that the window's content becomes empty and only the border of the window is visible.
After remoting onto their machines I have confirmed that it looks like the content of the window is frozen. When the window first opens it appears like its see through and displays whatever is behind it. If I move the window around the same frozen image of what was behind the window when it opened stays there. If I bring something in front of the Windows (such as a browser) the "frozen image" in the contents will change to a frozen image of whatever was in front of it. I have discovered that the buttons are still active and clickable in the window, so it's not completely frozen it just seems not to be drawing the content properly.
The issue only seems to affect a small percentage of my users and I cannot recreate this issue on any of my test machines. Any ideas about what is happening would be greatly appreciated.
If you have a user that's willing to experiment to find a solution, have them Disable Hardware Acceleration in WPF. If this fixes the issue, then it's most likely a graphics driver problem.

Resources