うコンポーネントのラインナップTabcontrol高さと高さの最大のアイテムです!

StackOverflow https://stackoverflow.com/questions/1073770

質問

必要があります。てtabcontrolのサイズの最大のタブの項目は、実際には、tabitemのコンテンツ)?

以降のtabcontrolは特定のサイズを割り当てでautosize:なが正しくですが、タブを切り替えを自動でサイズの高さや幅)の内容は、現在選択中のタブがあります。

私たいと思っているサイズ変更が起こうのtabcontrolいの高さを誇るアイテムが、まだまだでautosizeそのものです。

他のヒン?またdatabindingの Height 物件の各要素を使用してコンテンツの利用multibinding、バインディングの双方に ActualHeightItems 物件のTabcontrol.がその ActualHeight コンテンツの要素は常に0になります。

        <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>

            ...

で実現できるのだろうか。

役に立ちましたか?

解決 3

合わせなければならないという、容易に解消えているのだと思っていた。私たcontroltemplateの TabControl いずれにせよ、今の高さを設定します ContentPresenter 提ることで、選択されているタブです。これをコンバータと結合するための項目 TabControl, 対策をしなくてはならない場合があ利用 MeasureDesiredSize サイズにします。

    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
  • の内容などのサイズについては、ロード(コンバータの場合にだけ呼び出され項目の中で特定のプロパティに変更、ieだ).

他のヒント

はい、それを行うことができます:リユース・グリッド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>

問題は、 TabControl unloadsとの固コンテンツとして切り替え機能です。そのためのみぞ知るセカイのサイズコンテンツの活躍中のタブがあります。対応することができるでしょう変化のTabControl、その後の ない 破壊その子が、とても現在のものも隠れた).

このブログ エリック-マーティノー(Ericバークすべきだ。うえしましたが浮遊物のか、変更する必要がありますように:

  • すべての子どもを取り込み時に TabControl であるとみなされます。
  • 子どものたより崩壊した時の不活性

これは、適切なWPFの方法ではおそらくありませんが、あなたはすでに、すべてのコンテンツ要素を持っている場合、あなたは可能性が多分ループそれらを介して負荷にし、プログラム的にTabControlの高さを設定します。

これは、上に示したGrid.IsSharedSizeScopeのアプローチと一緒に私のために働いています。

そのSetCurrentValueだけではなく、SelectedIndexプロパティ設定するのに使用されることに注意してください - 私たちは可能な既存のバインディングを維持し、このように:

private void TabControl_OnLoaded(object sender, RoutedEventArgs e)
{
    //NOTE: loop through tab items to force measurement and size the tab control to the largest tab
    TabControl tabControl = (TabControl)sender;

    // backup selection
    int indexItemLast = tabControl.SelectedIndex;

    int itemCount = tabControl.Items.Count;

    for (
        int indexItem = (itemCount - 1);
        indexItem >= 0;
        indexItem--)
    {
        tabControl.SetCurrentValue(Selector.SelectedIndexProperty, indexItem);
        tabControl.UpdateLayout();
    }

    // restore selection
    tabControl.SetCurrentValue(Selector.SelectedIndexProperty, indexItemLast);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top