在ElementHost中使用Prism

时间:2012-03-26 12:08:51

标签: vb.net winforms prism

任何人都可以建议以下代码中可能缺少的内容。我的WinForm上没有显示任何内容。

我已经查看了以下有关此主题的相关帖子,但他们没有为我解决这个问题。

使用ElementHost的WinForm

    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

引导程序

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

贝壳

<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

1 个答案:

答案 0 :(得分:0)

我对这篇文章没有给予足够的重视 How to use Prisim within an ElementHost

问题是您需要一个非空的Application.Current,不等于typeof(应用程序)

因此我创建了以下类

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

并将我的WinForm构造函数更改为以下

    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