Pregunta

Es allí cualquier manera de tener a tabcontrol tomar el tamaño de la más grande de la ficha del artículo (bueno, en realidad, la tabitem del contenido)?

Desde el tabcontrol no tiene tamaño específico asignado debe autosize:lo hace correctamente, pero al cambiar de pestañas automáticamente se ajusta a la altura (y ancho) de los contenidos de la ficha seleccionada actualmente.

No quiero que el cambio de tamaño a suceder, y dejar que el tabcontrol asumir la altura del elemento más grande, pero todavía tienen que autosize sí mismo.

Alguna pista?Traté de enlace de datos para la Height las propiedades de cada elemento que se utiliza como contenido para el uso de un multibinding, con enlaces tanto en el ActualHeight y el Items propiedades del control Tabcontrol.Pero, por desgracia, el ActualHeight de los elementos de contenido es siempre 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>

            ...

Se puede hacer esto?

¿Fue útil?

Solución 3

En realidad, era más fácil de resolver que pensé. Ya que tenía un ControlTemplate para la TabControl de todos modos, ajustar la altura de la ContentPresenter presentar el contenido pestaña seleccionada. Yo esto utilizando un convertidor que se une a los elementos de la Measure, que mide si es necesario (utilizando DesiredSize) y comprueba FrameworkElement para el tamaño que necesito.

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

Esto funciona muy bien, con algunas salvedades:

  • todos los contenidos pestaña debe ser un <=>
  • los contenidos no cambian de tamaño una vez que se cargan (porque el convertidor sólo se invoca cuando los cambios de artículos de propiedad, es decir, una sola vez).

Otros consejos

Sí se puede hacer: reutilización de la red-rowdefinitions-para-cada-TabItem

Ejemplo:

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

El problema es que el TabControl descarga y vuelve a cargar su contenido a medida que cambia pestañas. Por lo tanto, sólo se conoce el tamaño del contenido de la pestaña activa en ese momento. Usted debe ser capaz de cambiar el TabControl tal que no destruye sus hijos, y siempre están presentes (pero tal vez oculto).

Esta entrada de blog por Eric Burke debe obtener empezado. De lo que puedo decir por rozar su puesto, tendrá que cambiarlo tal que:

  • Todos los niños se carga cuando se carga el <=>.
  • Los niños están ocultos en lugar de se derrumbó cuando están inactivos

No es, probablemente, en la forma adecuada WPF, pero, si ya tiene todos los elementos de contenido, tal vez podría bucle a través de ellos de la carga y ajustar la altura de la TabControl programación.

Esto funcionó para mí en conjunción con Grid.IsSharedSizeScope enfoque se muestra más arriba.

Tenga en cuenta que SetCurrentValue se utiliza en lugar de sólo la creación de la propiedad SelectedIndex - de esta manera mantenemos posibles consolidaciones existentes:

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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top