15

tabcontrol が最大のタブ項目 (実際には、タブ項目のコンテンツ) のサイズを取得する必要がある方法はありますか?

タブコントロールには特定のサイズが割り当てられていないため、自動サイズ調整する必要があります。これは正しく行われますが、タブを切り替えると、現在選択されているタブのコンテンツの高さ (および幅) に合わせて自動的にサイズ変更されます。

サイズ変更が発生したくないので、タブコントロールに最大のアイテムの高さを想定させますが、それでも自動サイズ調整を行います。

手がかりはありますか?タブコントロールのプロパティとプロパティのHeight両方にバインディングを使用して、マルチバインディングを使用するコンテンツとして使用される各要素のプロパティにデータバインディングを試みました。残念ながら、コンテンツ要素の は常に 0 です。ActualHeightItemsActualHeight

        <TabItem Header="Core" > 
            <Grid Margin="5">
                <Grid.Height>
                    <MultiBinding Converter="{Converters1:AllTabContentEqualHeightConverter}">
                        <Binding Path="ActualHeight" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type TabControl}}"/>
                        <Binding Path="Items" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type TabControl}}"/>
                    </MultiBinding>
                </Grid.Height>

            ...

これはできますか?

4

5 に答える 5

27

はい、できます: reuse-grid-rowdefinitions-for-each-tabitem

例:

    <TabControl Grid.IsSharedSizeScope="True">
        <TabItem Header="Tab 1">
            <Grid >
                <Grid.RowDefinitions>
                    <RowDefinition SharedSizeGroup="xxx"/>
                </Grid.RowDefinitions>
            </Grid>
        </TabItem>
        <TabItem Header="Tab 2">
            <Grid >
                <Grid.RowDefinitions>
                    <RowDefinition SharedSizeGroup="xxx"/>
                </Grid.RowDefinitions>
            </Grid>
        </TabItem>
   </TabControl>
于 2013-02-07T05:48:08.900 に答える
7

問題は、TabControlタブを切り替えるとコンテンツがアンロードおよびリロードされることです。したがって、現在アクティブなタブのコンテンツのサイズのみを認識します。TabControl を変更して、その子を決して破棄せず、常に存在するようにする必要があります (ただし、非表示にすることもできます)。

Eric Burke によるこのブログ投稿を参考にしてください。彼の投稿をざっと読んでわかることから、次のように変更する必要があります。

  • がロードされると、すべての子がロードTabControlされます。
  • 子がアクティブでないときは、折りたたむのではなく、非表示にします
于 2009-07-02T11:42:14.163 に答える
5

実際、思ったよりも簡単に解決できました。TabControlとにかくのコントロールテンプレートがあったのでContentPresenter、選択したタブのコンテンツを表示する高さを設定しました。の項目にバインドし、TabControl必要に応じて ( を使用して) 測定し、必要なサイズをMeasureチェックするコンバーターを使用してこれを行います。DesiredSize

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var items = value as ItemCollection;

        if (items == null)
            return null;

        double max = 0;
        foreach (TabItem item in items)
        {
            var content = item.Content as FrameworkElement;
            if (content == null) continue;

            if (!content.IsMeasureValid)
                content.Measure(new Size(int.MaxValue, int.MaxValue));

            var height = content.DesiredSize.Height;
            if (max < height)
                max = height;
        }

        return max;
    }

これは問題なく動作しますが、いくつかの注意事項があります。

  • すべてのタブのコンテンツはFrameworkElement
  • コンテンツがロードされると、サイズは変更されません (コンバーターが呼び出されるのは、Items プロパティが変更されたとき、つまり 1 回のみであるためです)。
于 2009-07-02T13:29:58.907 に答える
1

おそらく適切な WPF の方法ではありませんが、すべてのコンテンツ要素が既にある場合は、ロード時にそれらをループして、TabControlプログラムで高さを設定できます。

于 2009-07-02T11:54:33.780 に答える