¿Cómo escalar automáticamente el tamaño de fuente para un grupo de controles?

Tengo algunos TextBlocks en WPF en una cuadrícula que me gustaría escalar según su ancho / alto disponible. Cuando busqué la escala de tamaño de fuente automáticamente, la sugerencia típica es colocar el TextBlock en un ViewBox.

Así que hice esto:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Viewbox MaxHeight="18" Grid.Column="0" Stretch="Uniform" Margin="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <TextBlock Text="{Binding Text1}" />
    </Viewbox>

    <Viewbox MaxHeight="18" Grid.Column="1" Stretch="Uniform" Margin="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <TextBlock Text="{Binding Text2}" />
    </Viewbox>

    <Viewbox MaxHeight="18" Grid.Column="2" Stretch="Uniform" Margin="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <TextBlock Text="{Binding Text3}" />
    </Viewbox>
</Grid>

Y escala la fuente para cada TextBlock automáticamente. Sin embargo, esto parece gracioso porque si uno de los TextBlocks tiene un texto más largo, entonces estará en una fuente más pequeña, mientras que los elementos de la cuadrícula adyacente estarán en una fuente más grande. Quiero que el tamaño de fuente se amplíe por grupo, tal vez sería bueno si pudiera especificar un "Grupo de tamaño compartido" para que un conjunto de controles ajuste automáticamente el tamaño de la fuente.

p.ej.

El primer texto de los bloques de texto podría ser "3/26/2013 10:45:30 AM", y el segundo texto de TextBlocks podría decir "FileName.ext". Si están a lo ancho de una ventana, y el usuario comienza a cambiar el tamaño de la ventana cada vez más. La fecha comenzará a hacer que su fuente sea más pequeña que el nombre del archivo, dependiendo de la longitud del nombre del archivo.

Idealmente, una vez que uno de los campos de texto comience a cambiar el tamaño del tamaño del punto de la fuente, todos coincidirán. ¿Alguien ha encontrado una solución para esto o puede darme una oportunidad de hacer que funcione? Si requiere un código personalizado, con suerte, nosotros / yo podríamos volver a empaquetarlo en un Comportamiento Combinado o Conectado personalizado para que sea reutilizable para el futuro. Creo que es un problema bastante general, pero no pude encontrar nada al buscarlo.

Actualizar Intenté la sugerencia de Mathieu y funciona, pero tiene algunos efectos secundarios:

<Window x:Class="WpfApplication6.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="270" Width="522">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <Rectangle Grid.Row="0" Fill="SkyBlue" />

        <Viewbox Grid.Row="1" MaxHeight="30"  Stretch="Uniform" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="col"/>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="col"/>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="col"/>
                </Grid.ColumnDefinitions>

                <TextBlock Grid.Column="0" Text="SomeLongText" Margin="5" />
                <TextBlock Grid.Column="1" Text="TextA" Margin="5" />
                <TextBlock Grid.Column="2" Text="TextB" Margin="5" />

            </Grid>
        </Viewbox>
    </Grid>
</Window>

Honestamente, faltar columnas proporcionales de hte probablemente esté bien conmigo. No me importaría. Ajustar automáticamente las columnas para hacer un uso inteligente del espacio, pero tiene que abarcar todo el ancho de la ventana.

Observe sin tamaño máximo, en este ejemplo extendido el texto es demasiado grande:

<Window x:Class="WpfApplication6.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="270" Width="522">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <Rectangle Grid.Row="0" Fill="SkyBlue" />

    <Viewbox Grid.Row="1"  Stretch="Uniform" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" SharedSizeGroup="col"/>
                <ColumnDefinition Width="Auto" SharedSizeGroup="col"/>
                <ColumnDefinition Width="Auto" SharedSizeGroup="col"/>
            </Grid.ColumnDefinitions>

            <TextBlock Grid.Column="0" Text="SomeLongText" Margin="5" />
            <TextBlock Grid.Column="1" Text="TextA" Margin="5" />
            <TextBlock Grid.Column="2" Text="TextB" Margin="5" />

        </Grid>
    </Viewbox>
</Grid>

En este caso, me gustaría limitar el tamaño de la fuente para que no desperdicie la ventana vertical de bienes raíces.Espero que la salida se alinee a la izquierda, al centro y a la derecha, con la fuente lo más grande posible hasta el tamaño máximo deseado.

@adabyron

La solución que propones no es mala (y es la mejor hasta ahora) pero tiene algunas limitaciones. Por ejemplo, inicialmente quería que mis columnas fueran proporcionales (la segunda debería estar centrada). Por ejemplo, mis TextBlocks podrían estar etiquetando elInicio, centro y parada de un gráfico. donde la alineación importa.

<Window x:Class="WpfApplication6.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:b="clr-namespace:WpfApplication6.Behavior"
        Title="MainWindow" Height="350" Width="525">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <Rectangle Grid.Row="0" Fill="SkyBlue" />
        <Line X1="0.5" X2="0.5" Y1="0" Y2="1" Stretch="Fill" StrokeThickness="3" Stroke="Red" />

        <Grid Grid.Row="1">

            <i:Interaction.Behaviors>
                <b:MoveToViewboxBehavior />
            </i:Interaction.Behaviors>

            <Viewbox Stretch="Uniform" />
            <ContentPresenter >
                <ContentPresenter.Content>
                    <Grid x:Name="TextBlockContainer">
                        <Grid.Resources>
                            <Style TargetType="TextBlock" >
                                <Setter Property="FontSize" Value="16" />
                                <Setter Property="Margin" Value="5" />
                            </Style>
                        </Grid.Resources>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"  />
                            <ColumnDefinition Width="*"  />
                            <ColumnDefinition Width="*"  />
                            <ColumnDefinition Width="*"  />
                            <ColumnDefinition Width="*"  />
                        </Grid.ColumnDefinitions>

                        <TextBlock Grid.Column="0" Text="SomeLongText" VerticalAlignment="Center" HorizontalAlignment="Center" />
                        <TextBlock Grid.Column="2" Text="TextA" HorizontalAlignment="Center" VerticalAlignment="Center" />
                        <TextBlock Grid.Column="4" Text="TextB" HorizontalAlignment="Center" VerticalAlignment="Center" />
                    </Grid>
                </ContentPresenter.Content>
            </ContentPresenter>
        </Grid>
    </Grid>
</Window>

Y aqui esta el resultado. Observe que no sabe que se está recortando desde el principio, y luego, cuando sustituye a ViewBox, parece que la cuadrícula está predeterminada para el tamaño de columna "Auto" y ya no se alinea en el centro.

Respuestas a la pregunta(6)

Su respuesta a la pregunta