2

WindowsAPI では、TabControl は AdjustRect コマンドによって (非タブの) クライアント領域を計算できます。

WPFで(tabitemではなくtabpage)タブコントロール領域を計算したい。

どうすればいいですか?

XAML
MainWindow.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

Ok。WPF とその仕組みについて考えているほとんどすべての点で、根本的に間違っていることがわかります。

まず第一に、WPF は他の技術とは根本的に異なります。WPF を使用している場合は、古代のテクノロジから慣れ親しんだ恐ろしい HACK をすべて残し、The WPF Mentalityを採用する必要があります。

WPF UI は、すべてのビジュアル要素が階層的に配置されるビジュアル ツリーで構成されます。したがって、すべての UI 要素 (最上位を除くWindow) は、1 つのVisual Parentと 1 つ以上のVisual Childrenを持つことができると言えます。

WPF はControlTemplatesの概念も導入しています。これにより、特定の Control の視覚的な構造と外観を、その動作を失うことなく、また「所有者描画」などの恐ろしい手順に頼ることなく定義できます。

これにより、WPF レイアウト システムTemplateは、MarginVerticalAlignment、 、HorizontalAlignmentなどWidthのいくつかのプロパティを考慮して、UI 要素を親の「内側」の正しい位置に配置しますHeight

WPF は Resolution Independentであることを覚えておいてください。したがって、ほとんどの場合、UI 要素に固定のサイズと位置を与えたくないでしょう。ユーザーがサイズ変更したときに、レイアウト システムが利用可能な画面または親ウィンドウのサイズに合わせて自由に調整できるようにします。窓。

これは、すべての要素のサイズをハード コーディングし、特定のウィンドウ サイズのみをサポートする必要があった、従来の恐ろしい winforms アプローチよりもはるかに優れたアプローチであることに注意してください。

Default TabControl Templateを使用しTabControlて 2のa のビジュアル ツリーを見てみましょう。TabItem

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 によって生成された次のビジュアル ツリーを確認できます。

ここに画像の説明を入力

ここで最初に気付くのは、XAML で定義したTabItems とs だけでなく、さらに多くのことが行われていることです。TextBlockこれは、特定のコントロールの内部ビジュアル ツリーを定義する ControlTemplates によるものです。

これが、手続き型のハックで WPF を煩わせるべきではない主な理由であり、代わりに、WPF がうまく機能するようにします。

上記のリンクされた「WPF Mentality」の投稿と、このWPF レイアウトの紹介を読むことから始めることをお勧めします。

さらにサポートが必要な場合はお知らせください。

于 2013-10-05T15:37:37.367 に答える