PRISM 6のWPFアプリケーションでDevExpressのDocumentGroupとDocumentGroupAdapter(自分のサイトのE3339で説明)を使用しています。新しいドキュメントにナビゲートすることができ、美しいINavigationAwareインターフェイスが自分のビューモデルで正しく動作していることがわかります。唯一の問題は、実際のドキュメント(タブコントロールのタブのような)が2回目にナビゲートされたとき(ビューのINavigationAwareが期待どおりに機能する)、アクティブ化されないこと(タブが表示されることを意味する)です。PRISMでナビゲートするときにドキュメントグループ領域でDevExpress DocumentPanelを有効にする
答えて
私はDevExrpessコントロールに慣れていませんが、Infragistics xamDockManagerコントロールのカスタムリージョンアダプタとIActiveAwareビヘイビアを持っています。コードをチェックし、コントロールベンダーと連携するようにコードを変更できるかどうかを確認してください。
https://github.com/brianlagunas/xamDockManager-Region-Adapter
ブライアンに感謝します。私は 'トリック'がRegion.Deactivateメソッドにあると思います。これは、実際には領域からビューをアンロードするか、それとも単にビューをアクティブなものとしてマークするのではなく、メモリおよび領域内に保持するだけですか? – Aktaeon
さらにそれを見ると、ドキュメントグループアダプタがAllActiveRegionとして実装されていることが問題の1つと考えられます。明日はさらにチェックします。うまくいけば正しい方向に私を指摘してくれてありがとう;-) – Aktaeon
ありがとうブライアン!あなたのコードに基づいて動作しています。 – Aktaeon
は、私はそれがブライアンの回答に基づいて作業しました。ここに興味のある人は私のソリューションです。ビューを使用して私のビューモデルにIPanelInfoを実装します。その結果、すでに開いているドキュメントパネルに再度ナビゲートすると、アクティブ化される前にアクティブ化されます。現在はテストが不十分です。
public class DocumentGroupAdapter : RegionAdapterBase<DocumentGroup>
{
public DocumentGroupAdapter(IRegionBehaviorFactory behaviorFactory) :
base(behaviorFactory)
{
}
protected override IRegion CreateRegion()
{
return new SingleActiveRegion();
}
protected override void Adapt(IRegion region, DocumentGroup regionTarget)
{
region.Views.CollectionChanged += (s, e) => {
OnViewsCollectionChanged(regionTarget, e);
};
var manager = regionTarget.GetDockLayoutManager();
manager.DockItemClosing += (s, e) =>
{
Closing(region, e);
};
manager.ClosingBehavior = ClosingBehavior.ImmediatelyRemove;
}
protected override void AttachBehaviors(IRegion region, DocumentGroup regionTarget)
{
base.AttachBehaviors(region, regionTarget);
if (!region.Behaviors.ContainsKey(DocumentGroupSyncBehavior.BehaviorKey))
region.Behaviors.Add(DocumentGroupSyncBehavior.BehaviorKey, new DocumentGroupSyncBehavior() { HostControl = regionTarget });
}
private static void Closing(IRegion region, ItemEventArgs e)
{
var documentPanel = e.Item as DocumentPanel;
var view = documentPanel?.Content;
if (view == null) return;
var v = view as FrameworkElement;
var info = v?.DataContext as IPanelInfo;
info?.Close();
region.Remove(view);
}
private static void OnViewsCollectionChanged(DocumentGroup regionTarget, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
foreach (var view in e.NewItems)
{
var manager = regionTarget.GetDockLayoutManager();
var panel = manager.DockController.AddDocumentPanel(regionTarget);
panel.Content = view;
panel.ClosingBehavior = ClosingBehavior.ImmediatelyRemove;
var v = view as FrameworkElement;
var info = v?.DataContext as IPanelInfo;
if (info != null)
{
var myBinding = new Binding
{
Source = v.DataContext,
Path = new PropertyPath("Caption"),
Mode = BindingMode.TwoWay,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
};
BindingOperations.SetBinding(panel, BaseLayoutItem.CaptionProperty, myBinding);
}
manager.DockController.Activate(panel);
}
}
}
public class DocumentGroupSyncBehavior : RegionBehavior, IHostAwareRegionBehavior
{
public const string BehaviorKey = "DocumentGroupRegionActiveAwareBehavior";
private DocumentGroup _hostControl;
public DependencyObject HostControl
{
get { return _hostControl; }
set { _hostControl = value as DocumentGroup; }
}
protected override void OnAttach()
{
_hostControl.SelectedItemChanged += HostControl_SelectedItemChanged;
Region.ActiveViews.CollectionChanged += ActiveViews_CollectionChanged;
}
private void HostControl_SelectedItemChanged(object sender, SelectedItemChangedEventArgs e)
{
if (e.OldItem != null)
{
var item = e.OldItem;
//are we dealing with a DocumentPanel directly
if (Region.Views.Contains(item) && Region.ActiveViews.Contains(item))
{
Region.Deactivate(item);
}
else
{
//now check to see if we have any views that were injected
var contentControl = item as DocumentPanel;
if (contentControl != null)
{
var injectedView = contentControl.Content;
if (Region.Views.Contains(injectedView) && Region.ActiveViews.Contains(injectedView))
Region.Deactivate(injectedView);
}
}
}
if (e.Item != null)
{
var item = e.Item;
//are we dealing with a DocumentPanel directly
if (Region.Views.Contains(item) && !Region.ActiveViews.Contains(item))
{
Region.Activate(item);
}
else
{
//now check to see if we have any views that were injected
var contentControl = item as DocumentPanel;
if (contentControl != null)
{
var injectedView = contentControl.Content;
if (Region.Views.Contains(injectedView) && !Region.ActiveViews.Contains(injectedView))
Region.Activate(injectedView);
}
}
}
}
private void ActiveViews_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
//are we dealing with a view
var frameworkElement = e.NewItems[0] as FrameworkElement;
if (frameworkElement != null)
{
var documentPanel = GetContentPaneFromView(frameworkElement);
if (documentPanel != null && !documentPanel.IsActive)
documentPanel.ActivateCommand.Execute(null);
}
else
{
//must be a viewmodel
var viewModel = e.NewItems[0];
var contentPane = GetContentPaneFromFromViewModel(viewModel);
contentPane?.ActivateCommand.Execute(null);
}
}
}
private DocumentPanel GetContentPaneFromView(object view)
{
foreach (var baseLayoutItem in _hostControl.Items)
{
var contentPane = (DocumentPanel) baseLayoutItem;
if (contentPane?.Content != null && contentPane.Content == view)
return contentPane;
}
return null;
}
private DocumentPanel GetContentPaneFromFromViewModel(object viewModel)
{
foreach (var baseLayoutItem in _hostControl.Items)
{
var contentPane = (DocumentPanel) baseLayoutItem;
var content = contentPane?.Content as FrameworkElement;
if (content != null && content.DataContext == viewModel)
return contentPane;
}
return null;
}
}
public interface IPanelInfo
{
string Caption { get; set; }
void Close();
}
- 1. Devexpressグリッドで 'new item row'領域を無効にする方法
- 2. PRISMにDevExpress NavBarGroupの領域がありません
- 3. カスタム領域アダプタ(PRISM)
- 4. ユーザーコントロールを伸ばしてPRISMアプリケーションで領域をフルスクリーンにする
- 5. WPF、Prism v2、モーダルダイアログの領域、コード内に領域を追加する
- 6. 管理領域でMagento Varien_Profilerを有効にする
- 7. コンポーネントがテキスト領域を超えたときにスクロールペインを有効にする
- 8. PRISM + MEF - 正常に動作する領域を取得できません。
- 9. Silverlight 3/PRISMのフレーム領域アダプタとRegionContext
- 10. 並列領域内でOpenMP forループを選択的に有効にする
- 11. PRISM - ビューの子領域との再利用 - それはできますか?
- 12. PRISMでナビゲートするときに、自分のRegionAdapterでビューを取得
- 13. jQuery Mobileでリスト項目からクリック可能な領域を有効にする
- 14. TabControl region、パラメータを子領域に渡す方法は? WPF - Prism
- 15. Prism 2 SL:ボタンをクリックしたときに領域からビューを削除
- 16. することにより、東領域に領域
- 17. 非表示のラベルの空き領域を無効にする
- 18. c#状態でコード領域を無効にする
- 19. Spritekitビューの特定の領域でタッチを無効にする
- 20. 私はブロックと呼ばれる小領域の束に分割されます領域を有するポイント
- 21. PRISMの新しいビューにナビゲートするときにオブジェクトを渡す方法は?
- 22. .zipファイルにナビゲートするときにディレクトリ名が無効です
- 23. C++でベクトルインスタンスが占有する領域を理解する
- 24. 異なる領域でVNETの領域を重複することはできますか?
- 25. ジオフェンシング領域を設定し、ユーザーがジオフェンシング領域にいるときに通知を送信する方法
- 26. セルリーワーカー間で1つのマシンで共有するメモリ領域
- 27. html/javascript:イメージマップ領域を動的に無効/有効にする方法はありますか?
- 28. as3のあるクラスから別のクラスにテキスト領域を共有することはできますか?
- 29. Oracle Apex One領域が他の領域にスライドする
- 30. APEX ORACLE - PL/SQL + Javascriptで領域を動的に無効にする
INavigationAwareにはOnNavigatedToイベントがあります。それを使ってみましたか?それがうまくいくような気がする。 –
はい、このイベントは、地域にないビューモデルで発生します。私はすべての私のドキュメントビューモデルタイプを変更することなく、イベントにフックできるようにしたいと思います。 – Aktaeon
を追加して、タブでホストされているビューモデルのビューではなく、ビューを更新する "タブ"コントロールの責任であるため、この問題を解決する必要があります。 – Aktaeon