1

私が経験していることがここと同じかどうかはわかりません: Silverlight ChildWindow Memory Leak but...:

XAML で IsChecked がすべて false に設定された同じグループに 3 つのラジオ ボタンがある Silverlight ChildWindow があります。開いたときにそれらのいずれも選択したくありません。ビューモデルから ChildWindow を開きます。

if (_NewChildWindowCommand == null)
    _NewChildWindowCommand = new RelayCommand(param => _cwService.ShowDialog(_newLocation, new NewViewModel(), closed =>
      {
          if (_newLocation.DialogResult.HasValue && _newLocation.DialogResult.Value)
          {
              //do something
          }
          _newLocation = null;
           _newLocation = _container.GetExportedValue<INewChildWindow>();
      }));

次に、ラジオ ボタンの 1 つを選択して [OK] をクリックします。閉じて、もう一度開くと、開いたときにこれらのラジオボタンが選択されていないため、ChildWindowが破棄されたようです(本来あるべき方法)。そこで、もう一度ラジオ ボタンを選択し、[OK] をクリックして閉じます...しかし、3 回目に ChildWindow を開くと、閉じたときと同じラジオ ボタンが選択されています。これは私が理解していないものです。私が行ったように _newLocation=null を設定すると、コンテナから INewChildWindow を取得すると新しい ChildWindow が得られると思いましたが、そうではないようです。_newLocation を null に設定した後で GC.Collect() を呼び出してみましたが、うまくいきませんでした。また、ChildWindow で PartCreationPolicy を NonShared に設定しようとしましたが、うまくいきませんでした。

[ImportingConstructor]
public HomeViewModel(IChildWindowService cwService, INewLocationChildWindow newLocationChildWindow)
        {
            if (!IsDesignTime)
            {
                _cwService   = cwService;
                _newLocation = newLocationChildWindow;
                _catalog     = new AggregateCatalog();
                _catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
                _container   = new CompositionContainer(_catalog);
            }
        }

ここで何か他のことが起こっていますか?

4

1 に答える 1

1

ChildWindow の作成ポリシーを NonShared に設定します。_container.GetExportedValue<INewChildWindow>()次に、に置き換え_container.GetExport<INewChildWindow>()ます。これにより が得られLazy<INewChildWindow>、Value プロパティを使用して子ウィンドウを取得できます。次に、エクスポートを解放するために、_container.ReleaseExport を呼び出し、GetExport への呼び出しによって返された Lazy を渡します。

于 2011-01-29T03:53:53.807 に答える