1

SilverLight 4 アプリケーションで PRISM を使用しています。一部の地域に登録されたビューが表示されないという問題があります。

起動時にモジュールをロードするとき、次のようにいくつかのビューをリージョンに登録します。

RegionManager.RegisterViewWithRegion("MyRegion1", typeof(IMySubView1));
RegionManager.RegisterViewWithRegion("MyRegion2", typeof(IMySubView2));

IMyView と呼ばれるインターフェイスを実装するビューがあります。xaml には、次のようにグリッドで定義された領域を持つ 2 つのコンテンツ コントロールがあります。

<ContentControl Regions:RegionManager.RegionName="MyRegion1" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Grid.Row="0" Grid.RowSpan="1"/>
<ContentControl Regions:RegionManager.RegionName="MyRegion2" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Grid.Row="1" Grid.RowSpan="1"/>

ビューをメイン領域に追加するために、2 つの異なる方法を試しました。どちらもビューを追加し、ボタンなどの基本要素が表示されますが、ビューで定義された領域は関連するビューで埋められません。

方法 1:

object obj = _container.Resolve<IMyView>();
IRegion mainRegion = _regionManager.Regions["MainViewRegion"];
IRegionManager scoped = mainRegion.Add(obj, "test", true);
mainRegion.Activate(obj);

// Enabling the following call, it will fail saying the region MyRegion1 does not exist. Feels like it should?
// IRegion myRegion = scoped.Regions["MyRegion1"];

方法 2:

object obj = _container.Resolve<IMyView>();
_regionManager.AddToRegion("MainViewRegion", obj);
_regionManager.Regions["MainViewRegion"].Activate(obj);

xaml ファイルで定義された領域が登録されていないように感じます。そのため、登録されたビューが表示されません。

MainViewRegion は、TabControl のシェルで次のように定義されます。

<TabControl Margin="8,0,8,8" Regions:RegionManager.RegionName="MainViewRegion">

私の問題を解決するための提案は大歓迎です!

4

4 に答える 4

0

何時間ものトラブルシューティングの後、私は何かを見つけました。

Composite.Presentation \ Regions \ RegionManager.csには、IsInDesignModeというメソッドがあります。リージョンが作成されようとしているときにこのメソッドが呼び出され、このメソッドがtrueを返した場合、リージョンは作成されません。下記参照:

private static void OnSetRegionNameCallback(DependencyObject element, DependencyPropertyChangedEventArgs args)
{
    if (!IsInDesignMode(element))
    {
        CreateRegion(element);
    }
}

private static bool 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);
}

Silverlightアプリケーションが起動し、シェル内の領域がすべて正常に作成されると、Application.Currentプロパティのタイプは「MyName.Shell.App」になります。ただし、起動後にビューが追加されると、ユーザー入力への応答として、Application.Currentタイプが突然「Application」タイプになるため、IsInDesignModeメソッドはtrueを返し、リージョンは作成されません。

Application.Currentの状態を削除すると、すべてが期待どおりに機能します。だから問題は、私のアプリケーションに何か問題があるのか​​、それともプリズムのソースコードに何か問題があるのか​​ということです。

于 2010-08-12T08:06:09.413 に答える
0

この問題は Prism バージョン 4.0 で解消されました。問題が発生したとき、私は Prism バージョン 2.2 を実行していました。

于 2010-12-06T13:45:21.027 に答える
0

私は同じ問題に直面しています。アイデアは、何らかの理由で、既に作成された領域のビュー注入 {mainRegion.Add(obj, "test", true)} がビューを表示しないということです。私にとってうまくいった回避策は、コードから領域を作成してから、ビューを挿入することです。このようなもの:

Microsoft.Practices.Composite.Presentation.Regions.RegionManager.SetRegionManager(headerRegionContainer, _RegionManager); Microsoft.Practices.Composite.Presentation.Regions.RegionManager.SetRegionName(headerRegionContainer, regionName);

var view = _UnityContainer.Resolve(bag.HeaderViewType); _RegionManager.Regions[地域名].Add(view); _RegionManager.Regions[地域名].Activate(view);

残念ながら、この方法では目標を達成できませんが、できるかもしれません。

よろしく、

レベンテ

于 2010-08-06T08:17:59.933 に答える
0

あなたの _regionManager はどこから来たのですか? 適切な BootStrapper を作成しましたか? 必要なすべてのタイプを IoC コンテナー内に登録するには、MefBootstrapper または UnityBootstrapper (または、これらの IoC/拡張フレームワークのどちらも使用していない場合はカスタム クラス) から継承するクラスを作成する必要があります。

BootStrapper コードを投稿できますか?

于 2010-08-16T06:29:53.530 に答える