1

ドッキングマネージャーとしてAvalonDock2.0を使用するWPFアプリケーションがあります。AvalonDockが実行している新しく開いたタブの標準的な配置に関する問題に直面しています。

すべてのタブがタブバーに収まる限り、新しいタブがタブバーの右端の位置に追加されます。新しいタブがバーに収まらないとすぐに、新しいタブが左端の位置に追加され、前の右端のタブが消えます。

これがVisualStudioの標準の動作であることは知っていますが、私のアプリケーションでは、順序に意味があります。つまり、新しいタブは常に左端または右端の位置に追加する必要があります。スイッチはユーザーにとって非常に混乱します。

Avalon Dockに常に左端または右端の位置に新しいタブを追加させる方法はありますか?

4

1 に答える 1

4

私はそれを考え出した。ArrangeOverride(Size finalSize)メソッドのコードをDocumentPaneTabPanelから変更して、現在のタブが最初の位置に再配置されないようにしました。

パネルに合わない現在のタブの左側のタブが非表示になり、最も左側のタブが最初に非表示になります。現在のタブの右側のタブも非表示になっています。ここでは、最も右側のタブが最初に非表示になっています。オーバーフローがある場合、現在のタブは常にパネルの右端にあります。これは現時点では少し汚いですが、これをより良い方法で実装することはそれほど難しいことではないと思います。

コードは次のとおりです。

    protected override Size ArrangeOverride(Size finalSize)
    {
        double offset = 0.0;
        var children = Children.Cast<UIElement>().Where(ch => ch.Visibility != System.Windows.Visibility.Collapsed).ToList();
        if (children.Count > 0)
        {
            //find currently selected tab
            int i = 0;
            for (i = 0; i < children.Count(); i++)
            {
                TabItem doc = (TabItem)children[i];
                var layoutContent = doc.Content as LayoutContent;
                if (layoutContent.IsSelected)
                    break;
            }

            //calculate how many tabs left from the currently selected would fit in the panel
            int cur_ind = i;
            TabItem current_item = (TabItem)children[cur_ind];
            List<TabItem> t_to_display = new List<TabItem>();
            while (cur_ind >= 0 && offset + current_item.DesiredSize.Width <= finalSize.Width)
            {
                current_item = (TabItem)children[cur_ind];
                current_item.Visibility = System.Windows.Visibility.Visible;
                offset += current_item.DesiredSize.Width + current_item.Margin.Left + current_item.Margin.Right;
                t_to_display.Add(current_item);
                --cur_ind;
            }

            //arrange the fitting tabs on the left
            double cur_offset = offset;
            foreach (TabItem t in t_to_display)
            {
                cur_offset -= t.DesiredSize.Width + t.Margin.Left + t.Margin.Right;
                t.Arrange(new Rect(cur_offset, 0.0, t.DesiredSize.Width, finalSize.Height));
            }

            //arrange the tabs on the right
            cur_ind = i + 1;
            while (cur_ind < children.Count && offset + current_item.DesiredSize.Width <= finalSize.Width)
            {
                current_item = (TabItem)children[cur_ind];
                current_item.Visibility = System.Windows.Visibility.Visible;
                current_item.Arrange(new Rect(offset, 0.0, current_item.DesiredSize.Width, finalSize.Height));
                offset += current_item.DesiredSize.Width + current_item.Margin.Left + current_item.Margin.Right;
                cur_ind++;
            }

            while(cur_ind < children.Count)
            {
                current_item = (TabItem)children[cur_ind];
                current_item.Visibility = System.Windows.Visibility.Hidden;
                cur_ind++;
            }
        }

        return finalSize;

    }
于 2013-04-29T10:10:30.687 に答える