2

在 WindowsAPI 中,TabControl 可以通过 AdjustRect 命令计算(非选项卡)客户区。

我想计算 WPF 中的(tabpage,而不是 tabitem)选项卡控制区域。

我应该怎么做?

XAML
主窗口.xaml

...
<Grid>
  <TabControl x:Name="tabcontrol"/>
  <Button x:Name="outercontrol"/>
</Grid>
...

C#
MainWindow.xaml.cs

void Add(SomeObject obj)
{
  TabItem item = new TabItem() { Header = obj.Text, Tag = obj };
  tabcontrol.Items.Add(item);
  RepositionControl();
}

void RepositionControl()
{
  var margin = CalculateTabPageContentArea(); // like this...
  this.outercontrol.Margin = margin;
}
4

1 回答 1

1

好的。我发现您在考虑 WPF 及其工作原理的几乎所有事情上都是错误的。

首先,WPF 从根本上不同于任何其他技术。如果您正在使用 WPF,那么您真的需要抛开您可能习惯于古老技术的所有可怕的 HACK,并拥抱WPF 心态

WPF UI 由一个视觉树组成,其中所有视觉元素都以分层方式放置。因此可以说所有的 UI 元素(除了 top-most Window)可能有一个Visual Parent和一个或多个Visual Children

WPF 还引入了ControlTemplates的概念,它允许您定义任何给定控件的视觉结构和外观,而不会失去其行为,也不会诉诸诸如“所有者绘制”之类的可怕程序实践。

鉴于此,WPF 布局系统负责将 UI 元素放置在其包含父级“内部”的正确位置,同时考虑到多个属性,例如TemplateMarginVerticalAlignment、和。HorizontalAlignmentWidthHeight

请记住,WPF 是与分辨率无关的,因此大多数时候您不希望为 UI 元素提供固定的大小和位置,让布局系统在用户调整大小时自由地将它们调整为可用屏幕或父窗口大小窗户。

请注意,与传统的可怕的 winforms 方法相比,这是一种更好的方法,在这种方法中,您将对所有元素大小进行硬编码,因此必须仅支持特定的窗口大小。

让我们看看使用Default TabControl TemplateTabControl的2 TabItems的可视化树:

XAML:

<Window x:Class="MiscSamples.TabControlSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TabControlSample" Height="300" Width="300" x:Name="Window">
    <TabControl>
        <TabItem Header="Tab Item 1">
            <TextBlock Text="Tab Content 1" x:Name="TabContent1"/>
        </TabItem>
        <TabItem Header="Tab Item 2">
            <TextBlock Text="Tab Content 2" x:Name="TabContent2"/>
        </TabItem>
    </TabControl>
</Window>

结果:

在此处输入图像描述

使用Snoop或类似的间谍工具,我们可以看到由上述 XAML 生成的以下 Visual Tree:

在此处输入图像描述

您在这里注意到的第一件事是,除了我们在 XAML 中定义的TabItems 和s 之外,还有很多事情要做。TextBlock这是因为 ControlTemplates 定义了任何给定控件的内部可视树。

这是您不应该用任何程序性黑客来打扰 WPF 的主要原因,而是让它完成它的工作,它做得很好。

我建议您首先阅读上面链接的“WPF Mentality”帖子和WPF 布局介绍。

如果您需要进一步的帮助,请告诉我。

于 2013-10-05T15:37:37.367 回答