1

Prism は初めてで、ElementHost 内で Prisim コントロールをホストしようとしています。非常に基本的なものが欠けているようです。ElementHost を含む単一の WinForm があります。次のコードは次の形式です。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        Bootstrapper bootstrapper = new Bootstrapper();
        bootstrapper.Run();

        var child = bootstrapper.Container.Resolve<Shell>();
        elementHost.Child = child;

    }

BootStrapper は登録を処理します

public class Bootstrapper : UnityBootstrapper
{
    protected override DependencyObject CreateShell()
    {
        Container.RegisterType<MyView>();
        var shell = Container.Resolve<Shell>();
        return shell;
    }

    protected override IModuleCatalog GetModuleCatalog()
    {
        ModuleCatalog catalog = new ModuleCatalog();
        catalog.AddModule(typeof(MyModule));
        return catalog;
    }
}

この時点では、MyView.xaml は単なるラベルにすぎません。

Shell.xaml は、次の XAML を含む UserControl です。

<ItemsControl Name="MainRegion" cal:RegionManager.RegionName="MainRegion" />

モジュール コードは最小限です。

public class MyModule : IModule
{
    private readonly IRegionViewRegistry _regionViewRegistry;

    public MyModule(IRegionViewRegistry registry)
    {
        _regionViewRegistry = registry;   
    }

    public void Initialize()
    {
        _regionViewRegistry.RegisterViewWithRegion("MainRegion", typeof(MyView));
    }
}

View がリージョンに設定されない理由を突き止めようとして、Prism コードを深く調べてきました。基本的なものが欠けていますか?

4

2 に答える 2

4

その理由は、Prism の次のコードです。

private static bool RegionManager::IsInDesignMode(DependencyObject element)
{
    // Due to a known issue in Cider, GetIsInDesignMode attached property value is not enough to know if it's in design mode.
    return DesignerProperties.GetIsInDesignMode(element) || Application.Current == null
        || Application.Current.GetType() == typeof(Application);
}

その理由は、非 WPF アプリケーションでは Application.Current が NULL であるためです。

ソリューション:

  1. System.Windows.Application から継承する空のクラスを作成します。(名前は関係ありません):

プラグインへのエントリのポイントで、次のコードを実行します。

public class MyApp : System.Windows.Application
{
}

if (System.Windows.Application.Current == null)
{
    // create the Application object
    new MyApp();
}

これで終わりです。これで、null ではなく、typeof(Application) と等しくない Application.Current が作成されました。

于 2009-09-01T16:25:48.053 に答える