Creating Windows On a different Thread
https://www.imustread.com/2020/11/creating-windows-on-a-different-thread.html
If you want to go deeper into Multithreading windows using WPF then this will be a helpful solution. It will guide you to make a window in a different thread and some situation which you need to figure out.
You can use it for your own causes and you can also bind more difficult logic to your window and it will run in different threads.
Plan
- Purpose and problem description
- Annoying while trying to find the right solution and meanwhile solution
- Good idea with a custom window and final solution
Purpose and Problem Description
- There are so many backside items which do not work properly we would tell you something about this land of case.
- When we load data in bulk at that time WPF project render. For this situation, the solution is a thread for which you can use the same background methods.
- When run two threads at a time one thread will load the data in the background and another thread will work with the UI users in your project this is hard but you can manage it.
Annoying While Trying to Find the Right Solution and Meanwhile Solution
You know that .cs file which runs in the background it is easy to run Thread in it but for UI it is different WPF will run with two threads one thread will handle the render and another thread will manage the UI.
The thread which is handling the render will work in the background and another thread will work in UI. It will take care of event handle, user input, and UI code in any case it is difficult to work.
Example
internal void Makeondifferent ()
{
try
{
Thread newThread = new Thread(new ThreadStart(ThreadStartingPoint));
newThread.SetApartmentState(ApartmentState.STA);
newThread.IsBackground = true;
newThread.Start();
}
catch (Exception ex)
{
// logging it
}
}
private void ThreadStartingPoint()
{
try
{
Controller = new Controller();
Controller.Show();
System.Windows.Threading.Dispatcher.Run();
}
catch (Exception ex)
{
// logging it
}
}
- As we have seen in the example that after the login is done successfully then we can call the makeondifferent() method. At that time we can also run another thread. sleep(5000) will not stick this all processes will work underwater which is not related to use UI.
- WPF application is used for making adaptive layout it helps change the size we manage the size or moving the window from one place to another which is the lifecycle of the user. From the above information. You can fix/glued another window into the main window.
- There are two methods in the example one method is calculating the real size of the window and it will set the scaling (HD for 125% and 4k for 150% or 200%).
Example
internal static int GetScalingWidth()
{
return Screen.PrimaryScreen.Bounds.Width
}
internal static int GetScalingHeight()
{
return Screen.PrimaryScreen.Bounds.Height
}
- We have used the grid layout for the main window whose name is "grid layout". We have decided that a class will work for window 1 and another class will work for window 2. It will work as the position will be set to it.
- As shown below example will call the methods many times. The position, height, and width will change as it is called and this method is decided by the main window.
Example
private void WindowLocationChangedHandler(object sender, EventArgs e)
{
GetSettings();
}
private void GetSettings()
{
if (Manager.Current == null) return;
var content = (FrameworkElement)this.GridForOtherThread;
var currentPosition = content.PointToScreen(new Point(0, 0));
var widthFactor = MainWindow.GetScalingWidth();
var heightFactor = MainWindow.GetScalingHeight();
Manager.Current.Settings["Left"] = currentPosition.X / widthFactor;
Manager.Current.Settings["Top"] = currentPosition.Y / heightFactor;
Manager.Current.Settings["Width"] = content.ActualWidth * widthFactor;
Manager.Current.Settings["Height"] = content.ActualHeight * heightFactor;
Manager.Current.WindowSettingsChanged();
}
// Controller is our target window managed from Manager.
internal void SettingsChanged()
{
try
{
if (Controller == null) return;
Controller.Dispatcher.Invoke(() => UpdateWindowsSettings());
}
catch (Exception ex)
{
// log it
}
}
private void UpdateWindowsSettings()
{
Controller.Width = Settings["Width"];
Controller.Height = Settings["Height"];
Controller.Left = Settings["Left"];
Controller.Top = Settings["Top"];
}
- The next step is size change but watch it precisely if it does work accordingly then see if the event is subscribed or not which will change the size of the main window.
- As a rule, whichever changes are happening in your window should be reflected in the main window. We have to see the event active and deactivated for which we have created 2 methods. A method that is set to true then it will set the topmost and if it's false then the main window will be activated or will be changed.
- We have learned many things from whatever we have done till now but still, we didn't find the solution to our problem, but we are happy that we learned something new today. Now we know that what is the cause of the problem so let's solve it.
Finally, a Good Idea with a Custom Window
AllowTransperency for default window. You can set this when other window styles are set to NONE, and say in other ways that it is not possible.
Window style property can set style like top-bottom-minimize-maximize-close window etc and you can set icons of them. You can do this only when you have to publish the window.
You can change these properties as shown in the example which we saw in the previous program.
internal void WindowActivated()
{
try
{
if (Controller == null) return;
if (Controller.Dispatcher.CheckAccess())
{
Controller.Topmost = true;
Controller.Topmost = false;
Controller.Focus();
}
else
{
Controller.Dispatcher.Invoke(DispatcherPriority.ApplicationIdle, new ThreadStart(() =>
{
Controller.Topmost = true;
Controller.Topmost = false;
Controller.Focus();
}));
}
}
catch (Exception ex)
{
// log it by your favorite logger
}
}
Conclusion
We hope that you acquired a clear picture of thread through this blog, if you know how to use thread, how to give the solution by platform, you can build any software or application with regard to the requirements management, and at the same time, the different platform works as same. You can do communication between two windows.
A Seasoned technocrat with years of experience building technical solutions for various industries using Microsoft technologies. Wish sharp understanding and technical acumen, have delivered hundreds of Web, Cloud, Desktop, and Mobile solutions and is heading the technical department at WPF Application Development Company – iFour Technolab Pvt. Ltd.