0

https://compositewpfcontrib.svn.codeplex.com/svn/Trunk/src/Extensions.Infragistics/Composite.Wpf.Infragistics/CompositeWPFContrib.Composite.Wpf.Infragistics/XamDockManager/Regions/TabGroupPaneRegionAdapter.csから TabGroupPaneRegionAdapter を使用しています。

私がこれで得ている問題は、おそらく 'contentPane.ExecuteCommand(ContentPaneCommands.Close);' という行が原因で、contentpane の Closed イベントが 2 回実行されることです。つまり、十字ボタンが押されて閉じられたイベントが最初に呼び出されたときに、それがまだ xamDockManager にあったため、行 "contentPane.ExecuteCommand(ContentPaneCommands.Close);" を意味します。閉じたイベントを再度実行して呼び出します。これを解決する方法についてのアイデア。

アダプターからのコードの一部を次に示します。

private void OnViewsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e, IRegion region, TabGroupPane regionTarget)
    {
        if (e.Action == NotifyCollectionChangedAction.Add)
        {
            //Add content panes for each associated view. 
            foreach (object item in e.NewItems)
            {
                UIElement view = item as UIElement;

                if (view != null)
                {
                    ContentPane newContentPane = new ContentPane();
                    newContentPane.Content = item;
                    //if associated view has metadata then apply it.
                    if (view.GetTabGroupPaneMetadata() != null)
                    {
                        newContentPane.Header = (view.GetTabGroupPaneMetadata()).Header;
                    }
                    //When contentPane is closed remove the associated region 
                    newContentPane.Closed += delegate(object contentPaneSender, PaneClosedEventArgs args)
                    {
                        OnContentPaneClosed((ContentPane)contentPaneSender, args, region);
                    };


                    regionTarget.Items.Add(newContentPane);
                }
            }
        }
        else
        {
            if (e.Action == NotifyCollectionChangedAction.Remove)
            {
                //Associated View has been removed => remove the associated ContentPane from XamDockManager
                XamDockManager xamDockManager = regionTarget.FindDockManager();
                IEnumerable<ContentPane> contentPanes = xamDockManager.GetPanes(PaneNavigationOrder.VisibleOrder);

                foreach (ContentPane contentPane in contentPanes)
                {
                    if (e.OldItems.Contains(contentPane.Content))
                    {
                        contentPane.Content = null;
                        contentPane.CloseAction = PaneCloseAction.RemovePane;
                        contentPane.ExecuteCommand(ContentPaneCommands.Close);
                    }
                }


            }
        }
    }

    private void OnContentPaneClosed(ContentPane contentPane, PaneClosedEventArgs args, IRegion region)
    {
        object view = contentPane.Content;
        if (region.Views.Contains(view))
        {
            region.Remove(view);
        }
    }

どんな助けでも大歓迎ですありがとう。イマド。

4

2 に答える 2

1

ここでまったく同じ問題について、インフラジスティックス フォーラム スレッドをフォローしていただけると思います。

http://www.infragistics.com/community/forums/t/73207.aspx

于 2012-09-05T09:14:35.127 に答える
0

ここで利用可能な xamDockManager 用のより優れたリージョン アダプターがあります。

http://brianlagunas.com/xamdockmanageran-updated-prism-region-adapter/

于 2013-05-29T03:31:34.230 に答える