Hay varias preguntas relacionadas con ScrollViewer que he investigado, pero ninguna de ellas me ha funcionado. Esto casi con seguridad se debe a mi falta de comprensión con respecto al tamaño de un elemento. En primer lugar, mi XAML (que no sea la definición control de usuario, esto es todo el control):Incrustar un control de elementos en un ScrollViewer
<DockPanel Width="Auto">
<ScrollViewer DockPanel.Dock="Top" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Visible" CanContentScroll="True" BorderBrush="{DynamicResource PanelBorder}" BorderThickness="1,1,1,1" Background="{DynamicResource LightGradientBackgroundBrush}">
<ItemsControl Focusable="false" Width="Auto" MinHeight="30" ItemsSource="{Binding RequiredFields}" OverridesDefaultStyle="False">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<DockPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="3,0,3,3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="110"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Content="{Binding Path=Header, Mode=OneTime}" Foreground="{DynamicResource SilverBorderColorBrush}" Grid.Column="0"/>
<TextBox Text="{Binding Path=Value}" HorizontalAlignment="Stretch" Foreground="{DynamicResource SilverBorderColorBrush}" Grid.Column="1"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</DockPanel>
Este control se carga dentro de una pestaña como el contenido. La ventana que aloja la pestaña es redimensionable, y el tamaño mínimo del contenido de la pestaña es 60. Lo que intento hacer es hacer que el desplazador de desplazamiento llene la pestaña, pero no empuje la pestaña más allá de los límites de la ventana. Con el XAML anterior, el contenido excedente da como resultado la expansión de la altura de la pestaña y aparece una barra de desplazamiento en la ventana, no en la pestaña.
El scrollviewer se está expandiendo al tamaño de sus elementos secundarios, por lo tanto, empuja la altura de la pestaña hacia afuera. Lo que quiero es que el scrollviewer se fije al tamaño de la pestaña y que el contenido dentro del scrollviewer crezca dentro de los límites del scrollviewer, de modo que se presente una barra de desplazamiento cuando haya demasiado contenido.
¿Dónde me estoy equivocando?
Editar:
El problema es la altura, no el ancho. El ancho se está comportando como debería. Cambié el contenedor a una grilla como se sugirió, pero a menos que establezca la propiedad Height, la grilla se expande para ajustarse al contenido del scrollviewer expandido, causando el mismo problema que antes.
XAML Actualizado:
<Grid MinHeight="60" VerticalAlignment="Top">
<Border BorderBrush="{DynamicResource PanelBorder}" BorderThickness="1,1,1,1">
<ScrollViewer
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Visible"
CanContentScroll="True"
BorderBrush="{DynamicResource PanelBorder}"
BorderThickness="1,1,1,1"
Background="{DynamicResource LightGradientBackgroundBrush}"
>
<ItemsControl Focusable="false" Width="Auto" MinHeight="30" ItemsSource="{Binding RequiredFields}" OverridesDefaultStyle="False">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="3,0,3,3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="110"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Content="{Binding Path=Header, Mode=OneTime}" Foreground="{DynamicResource SilverBorderColorBrush}" Grid.Column="0"/>
<TextBox Text="{Binding Path=Value}" HorizontalAlignment="Stretch" Foreground="{DynamicResource SilverBorderColorBrush}" Grid.Column="1"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="DockPanel.Dock" Value="Top"/>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
</ScrollViewer>
</Border>
</Grid>
Ninguna de las respuestas a continuación han ayudado a hacer este trabajo, pero estoy bastante seguro de que las respuestas trabajarían en la mayoría de los casos.
Mi control se aloja dentro de una página de pestañas. Se carga dinámicamente y no tengo control sobre cómo está diseñada la página de pestañas. Mi intuición es que el control de pestañas permite tanto espacio como el contenido dentro de él. Debido a que la grilla en mi control dice usar todo el espacio disponible, y la página de pestañas ofrece tanto espacio como el contenedor hijo necesita, y el control de elementos está tratando de usar todo el espacio que ofrece la grilla; culmina en la expansión de la pestaña que contiene todo el contenido de ItemsControl.
Si la página de pestañas se creó para que no se expanda y se ajuste a su contenido, las siguientes soluciones funcionarían. Lamentablemente, no creo que este sea el caso.
Todo un día perdido en esto. Tiempo de seguir adelante.
Gracias @Mike. Si utilizo un control de cuadrícula como envoltorio y establezco una altura fija, funciona como se anuncia. Sin embargo, si la ventana se expande, hay un montón de espacio vacío en la parte superior/inferior. Quiero que la grilla se expanda con su padre, pero restrinja a sus hijos (verticalmente). Por lo tanto, prefiero no establecer una altura fija. Si no lo hago, se produce el mismo comportamiento incorrecto. –
Lo siento, quise decirle que cree una definición de columna y fila y establezca el ancho y el alto respectivamente en *. Eso debería lograr lo que quieres. –
Esto tampoco me funcionó, pero creo que descubrí por qué. Voy a editar mi pregunta con lo que pienso, por lo que esta pregunta no es una pérdida de tiempo total. Gracias por tu ayuda. –