Alyanto
asked on
Starting a WPF form via Reflection
Is there any special requirement for starting a WPF form via reflection? I have used reflection within a forms environment but before I started to upgrade what we have to a WPF application I thought it would be prudent to ask the community experts.
it should be the same. I have you tried it and got issues?
ASKER
Hi Eric
I am now yes, I can start a windows form in the library. The code at the bottom is failing, however if I substitute the line below it works as I might expect.
Substitute
MainWindow has the XAML extension and the FormsWindow has .cs. I have considered firing a class to start MainWindow but as yet I have not seen a good example to help me.
I am now yes, I can start a windows form in the library. The code at the bottom is failing, however if I substitute the line below it works as I might expect.
Substitute
oType = tryit.GetType("Perfcentre.Forms.MainWindow");
with oType = tryit.GetType("Perfcentre.Forms.FormsWindow");
it works fine.MainWindow has the XAML extension and the FormsWindow has .cs. I have considered firing a class to start MainWindow but as yet I have not seen a good example to help me.
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace Perfcentre
{
public class clsMain
{
[STAThread]
static public void Main()
{
Assembly tryit;
tryit = Assembly.Load("Perfcentre.Forms");
Type oType;
oType = tryit.GetType("Perfcentre.Forms.MainWindow");
object DoSomethingClass;
DoSomethingClass = Activator.CreateInstance(oType);
Form frm = (Form)DoSomethingClass;
Application.Run(frm);
}
}
}
>>MainWindow has the XAML extension and the FormsWindow has .cs
Does that means that FormsWindow is not a form but just a class? If it is just a class, it won't be castable to a Form!
Does that means that FormsWindow is not a form but just a class? If it is just a class, it won't be castable to a Form!
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Actually Eric that is very much the way I was heading for, I will give the code a try today. I had been looking for such an article., thank you for that. I will report probably by Monday as to its success.
ASKER
I will post what I did here for future reference.
It is not now a WPF form.
The library hosting the wpf form is called Reflection_App3 and the windows one is Reflection_App1 and the form is called UserControl1. Obvious I know but sometimes it is worth saying. The example that Eric gave got me 99% of the way with the very small problem that LoadAssembly was not indicated as static in the example and the steps followed were not there which is why I wrote them here for both my notes and anyone else.
- Step 1 Created a solution with a standard forms project in it.
- Step 2 Added a library project.
- Step 3 Added references to PresentationCore, PresentationFramework, System.Xaml, and WindowsBase
- Step 4 Added a WPF user control because that is all that is available I modified the control to have this XAML
<Window x:Class="Reflection_App3.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Background="BlueViolet">
<Grid>
</Grid>
</Window>
It is not now a WPF form.
- Step 5 Add to the windows app these references: PresentationFramework, WindowsBase, and the WPF project.
- Step 6 Add this code to the Program class.
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows;
using System.Windows.Threading;
namespace Reflection_App1
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
System.Windows.Forms.Application.EnableVisualStyles();
System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);
ThreadProc();
System.Windows.Forms.Application.Run(); // Keep on running!
}
private static void ThreadProc()
{
if (System.Windows.Application.Current == null)
new System.Windows.Application();
try
{
string assemblyName = string.Format("{0}\\Reflection_App3.dll", new FileInfo(Assembly.GetExecutingAssembly().Location).DirectoryName);
System.Windows.Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
{
Window wnd = LoadAssembly(assemblyName, "UserControl1");
wnd.Show();
}));
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(string.Format("Failed to load window from{0} - {1}", "OtherWindow", ex.Message));
throw new Exception(String.Format("Failed to load window from{0} - {1}", "OtherWindow", ex.Message), ex);
}
}
private static Window LoadAssembly(String assemblyName, String typeName)
{
try
{
Assembly assemblyInstance = Assembly.LoadFrom(assemblyName);
foreach (Type t in assemblyInstance.GetTypes().Where(t => String.Equals(t.Name, typeName, StringComparison.OrdinalIgnoreCase)))
{
var wnd = assemblyInstance.CreateInstance(t.FullName) as Window;
return wnd;
}
throw new Exception("Unable to load external window");
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(string.Format("Failed to load window from{0}{1}", assemblyName, ex.Message));
throw new Exception(string.Format("Failed to load external window{0}", assemblyName), ex);
}
}
}
}
The library hosting the wpf form is called Reflection_App3 and the windows one is Reflection_App1 and the form is called UserControl1. Obvious I know but sometimes it is worth saying. The example that Eric gave got me 99% of the way with the very small problem that LoadAssembly was not indicated as static in the example and the steps followed were not there which is why I wrote them here for both my notes and anyone else.
ASKER
Genius mate, quite to the point, as you can see I did a write up so that the steps were clearer than the article you pointed to. I hope that it helps others if only a little by doing this. Again many thanks. Is there an A+ grade perhaps?
ASKER
line in article "It is not now a WPF form" should read "It is now a WPF form".