0

Can anyone suggest what might be missing from the following code. I am getting nothing displayed on my WinForm.

I have looked at the following related posts on this topic but they haven't solved the issue for me.

WinForm with ElementHost

    Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    '   WPF application instance
    _wpfApplication = Application.Current()

    If Application.Current Is Nothing Then
        _wpfApplication = New Application()
    End If

    '   Load the application modules
    Dim unityBootstrapper As New Bootstrapper()
    unityBootstrapper.Run()

    '   Bind the shell to the ElementHost
    Dim shellElement = unityBootstrapper.Container.Resolve(Of Shell)()
    ehMaster.Child = shellElement

End Sub

Bootstrapper

Public NotInheritable Class Bootstrapper
Inherits UnityBootstrapper

Protected Overrides Function CreateShell() As DependencyObject
    Return New Shell
End Function

Protected Overrides Function GetModuleCatalog() As IModuleCatalog
    Dim catalog As ModuleCatalog = New ConfigurationModuleCatalog()
    catalog.AddModule(GetType(Pitchbook.Excel.ChartWizardModule))
    Return catalog
End Function

End Class

Shell

<UserControl x:Class="Shell"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cal="http://www.codeplex.com/CompositeWPF">
<DockPanel>
    <ItemsControl x:Name="HeaderRegion" cal:RegionManager.RegionName="HeaderRegion" DockPanel.Dock="Top" Height="auto">

    </ItemsControl>
    <ItemsControl x:Name="LeftRegion" cal:RegionManager.RegionName="LeftRegion" Width="auto" DockPanel.Dock="Left">

    </ItemsControl>
    <ItemsControl x:Name="MainRegion" cal:RegionManager.RegionName="MainRegion" DockPanel.Dock="Bottom">

    </ItemsControl>
</DockPanel>
</UserControl>

Partial Public Class Shell
Inherits UserControl

Public Sub New()
    InitializeComponent()
End Sub

End Class

ChartWizardModule

Public NotInheritable Class ChartWizardModule
Implements IModule

Private ReadOnly regionManager As IRegionManager

Public Sub Initialize() Implements IModule.Initialize
    regionManager.RegisterViewWithRegion("MainRegion", GetType(Test))
End Sub

Public Sub New(regionManager As IRegionManager)
    Me.regionManager = regionManager
End Sub

End Class
Community
  • 1
  • 1
dior001
  • 751
  • 1
  • 13
  • 32

1 Answers1

0

I didn't pay enough attention to this post How to use Prisim within an ElementHost

The issue is that you need an Application.Current that is not null and is not equal to typeof(Application).

Therefore I created the following class

Public Class WpfApplicationAdapter
    Inherits Windows.Application

    '   HACK - This class shouldn't be required. Look out for a resolution to this in future WPF versions.

End Class

And changed my WinForm constructor to the following

    Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    If Application.Current Is Nothing Then
        Dim wpfAppAdapter As New WpfApplicationAdapter
    End If

    '   Load the application modules
    Dim formBootstrapper As New Bootstrapper
    formBootstrapper.Run()

    '   Get the current instance of shell and bind it to the ElementHost
    Dim shellElement = formBootstrapper.Container.Resolve(Of Shell)()
    ehMaster.Child = shellElement

End Sub
Community
  • 1
  • 1
dior001
  • 751
  • 1
  • 13
  • 32