Tengo un simple WrapPanel
que contiene varios controles anchos. Cuando cambio el tamaño del Width
del Window
, todo funciona como se esperaba. Los controles se transmitirán en una sola línea si hay espacio suficiente o se ajustarán a la siguiente línea cuando no haya suficiente espacio.WPF wrap panel y desplazamiento
Sin embargo, lo que necesito es que si todos los controles están básicamente apilados verticalmente (ya que no hay más espacio horizontal) y el Width
del Window
se reduce aún más, aparece una barra de desplazamiento horizontal para que puede desplazarse y ver todo el control si quiero. A continuación está mi xaml. Traté de envolver el WrapPanel
en un ScrollViewer
pero no pude lograr mi objetivo.
<Window x:Class="WpfQuotes.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="Auto" Width="600" Foreground="White">
<WrapPanel>
<Button Width="250">1</Button>
<Button Width="250">2</Button>
<Button Width="250">3</Button>
</WrapPanel>
</Window>
Así que si se reduce el Width
de lo anterior Window
a su mínimo, usted no será capaz de ver el texto de los botones. Me gustaría que aparezca una barra de desplazamiento horizontal para que pueda desplazarme para ver el texto pero no interferir con la funcionalidad de envoltura habitual.
Gracias.
Actualización: He seguido la sugerencia de Paul a continuación y la barra de desplazamiento horizontal aparece como se espera ahora. Sin embargo, también quería el desplazamiento vertical disponible, así que configuré VerticalScrollBarVisibility="Auto"
. El problema es que si cambio el tamaño de la ventana para que aparezca una barra de desplazamiento vertical, la horizontal también siempre aparece, incluso si no es necesaria (hay suficiente espacio horizontal para ver todo el control). Parece que la barra de desplazamiento vertical que aparece está jugando con el ancho del scrollviewer. ¿Hay alguna manera de corregir esto para que la barra de desplazamiento horizontal no aparezca a menos que realmente se necesite?
A continuación es mi XAML y el único código añadí en el CustomWrapPanel
:
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cwp="clr-namespace:CustomWrapPanelExample"
Title="Window1" Height="Auto" Width="300" Foreground="White" Name="mainPanel">
<ScrollViewer x:Name="MyScrollViewer" HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto">
<cwp:CustomWrapPanel Width="{Binding ElementName=MyScrollViewer, Path=ActualWidth}">
<Button Width="250">1</Button>
<Button Width="250">2</Button>
<Button Width="250">3</Button>
<Button Width="250">4</Button>
<Button Width="250">5</Button>
<Button Width="250">6</Button>
<Button Width="250">7</Button>
<Button Width="250">8</Button>
<Button Width="250">9</Button>
</cwp:CustomWrapPanel>
</ScrollViewer>
</Window>
Lo único que se reemplaza en CustomWrapPanel
:
protected override Size MeasureOverride(Size availableSize)
{
double maxChildWidth = 0;
if (Children.Count > 0)
{
foreach (UIElement el in Children)
{
if (el.DesiredSize.Width > maxChildWidth)
{
maxChildWidth = el.DesiredSize.Width;
}
}
}
MinWidth = maxChildWidth;
return base.MeasureOverride(availableSize);
}
¿Puedes publicar el XAML con el ScrollViewer? – hackerhasid