gpt4 book ai didi

wpf - Avalondock 新标签定位和顺序

转载 作者:行者123 更新时间:2023-12-02 05:17:23 27 4
gpt4 key购买 nike

我有一个使用 Avalon Dock 2.0 作为停靠管理器的 WPF 应用程序。我遇到了有关 Avalon Dock 正在执行的新打开选项卡的标准定位问题。

只要所有选项卡都适合选项卡栏,就会在选项卡栏的最右侧位置附加一个新选项卡。一旦新标签不适合栏,新标签就会添加到最左边的位置,使之前最右边的标签消失。

我知道这是 Visual Studio 的标准行为,但在我的应用程序中,顺序有意义。这意味着新选项卡应该总是添加在最左边或最右边的位置。该开关对用户来说非常困惑。

有没有办法让 Avalon Dock 总是在最左边或最右边的位置添加一个新标签?

最佳答案

我想通了。我更改了 DocumentPaneTabPanel 的 ArrangeOverride(Size finalSize) 方法中的代码,以防止将当前选项卡重新定位到第一个位置。

它现在隐藏当前标签左侧不适合面板的标签 - 首先隐藏最左边的标签。当前选项卡右侧的选项卡也被隐藏 - 此处首先隐藏最右边的选项卡。如果出现溢出,则当前选项卡始终位于面板的最右侧。目前这有点脏,但我认为以更好的方式实现它应该不会那么难。

代码如下:

    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;

}

关于wpf - Avalondock 新标签定位和顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14436696/

27 4 0