tiempo piernas para musculares muscular estiramientos estiramiento elongacion ejercicios duracion cuerpo c# wpf expander stretch

c# - piernas - estiramientos musculares



¿Cómo puedo hacer un estiramiento de expansión WPF? (8)

Esta solución es mucho más simple y no afecta otros controles de expansión que pueda usar en su aplicación.

<Expander ExpandDirection="Right" Grid.Column="0" Name="topOfB"> <Expander.Header> <Grid HorizontalAlignment="Stretch" Width="{Binding Path=ActualWidth, ElementName=topOfB}"> <!-- control content goes here -->

El control Expander en WPF no se estira para llenar todo el espacio disponible. ¿Hay alguna solución en XAML para esto?


Estoy bastante sorprendido de que nadie haya mencionado que solo edite la plantilla de control, todas las demás soluciones tienen algunos inconvenientes bastante serios: no calcula correctamente el ancho, no vuelve a dibujar, no procesa el tiempo, etc.

Esta plantilla de control modificará la alineación horizontal del presentador de contenido del encabezado para que coincida con los expansores reales (lo que significa que se ampliará)

<ControlTemplate x:Key="ExpanderControlTemplate1" TargetType="{x:Type Expander}"> <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="3" SnapsToDevicePixels="True"> <DockPanel> <ToggleButton x:Name="HeaderSite" ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" DockPanel.Dock="Top" Foreground="{TemplateBinding Foreground}" FontWeight="{TemplateBinding FontWeight}" FontStyle="{TemplateBinding FontStyle}" FontStretch="{TemplateBinding FontStretch}" FontSize="{TemplateBinding FontSize}" FontFamily="{TemplateBinding FontFamily}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Margin="1" MinWidth="0" MinHeight="0" Padding="{TemplateBinding Padding}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"> <ToggleButton.FocusVisualStyle> <Style> <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate> <Border> <Rectangle Margin="0" SnapsToDevicePixels="True" Stroke="Black" StrokeThickness="1" StrokeDashArray="1 2"/> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> </ToggleButton.FocusVisualStyle> <ToggleButton.Style> <Style TargetType="{x:Type ToggleButton}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ToggleButton}"> <Border Padding="{TemplateBinding Padding}"> <Grid Background="Transparent" SnapsToDevicePixels="False"> <Grid.ColumnDefinitions> <ColumnDefinition Width="19"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Ellipse x:Name="circle" Fill="White" HorizontalAlignment="Center" Height="19" Stroke="#FF333333" VerticalAlignment="Center" Width="19"/> <Path x:Name="arrow" Data="M1,1.5L4.5,5 8,1.5" HorizontalAlignment="Center" SnapsToDevicePixels="False" Stroke="#FF333333" StrokeThickness="2" VerticalAlignment="Center"/> <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Grid.Column="1" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="4,0,0,0" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Center"/> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="IsChecked" Value="True"> <Setter Property="Data" TargetName="arrow" Value="M1,4.5L4.5,1 8,4.5"/> </Trigger> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Stroke" TargetName="circle" Value="#FF5593FF"/> <Setter Property="Fill" TargetName="circle" Value="#FFF3F9FF"/> <Setter Property="Stroke" TargetName="arrow" Value="Black"/> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Stroke" TargetName="circle" Value="#FF3C77DD"/> <Setter Property="StrokeThickness" TargetName="circle" Value="1.5"/> <Setter Property="Fill" TargetName="circle" Value="#FFD9ECFF"/> <Setter Property="Stroke" TargetName="arrow" Value="Black"/> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Stroke" TargetName="circle" Value="#FFBCBCBC"/> <Setter Property="Fill" TargetName="circle" Value="#FFE6E6E6"/> <Setter Property="Stroke" TargetName="arrow" Value="#FF707070"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </ToggleButton.Style> </ToggleButton> <ContentPresenter x:Name="ExpandSite" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" DockPanel.Dock="Bottom" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" Visibility="Collapsed" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> </DockPanel> </Border> <ControlTemplate.Triggers> <Trigger Property="IsExpanded" Value="True"> <Setter Property="Visibility" TargetName="ExpandSite" Value="Visible"/> </Trigger> <Trigger Property="ExpandDirection" Value="Right"> <Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Right"/> <Setter Property="DockPanel.Dock" TargetName="HeaderSite" Value="Left"/> <Setter Property="Style" TargetName="HeaderSite"> <Setter.Value> <Style TargetType="{x:Type ToggleButton}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ToggleButton}"> <Border Padding="{TemplateBinding Padding}"> <Grid Background="Transparent" SnapsToDevicePixels="False"> <Grid.RowDefinitions> <RowDefinition Height="19"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Grid> <Grid.LayoutTransform> <TransformGroup> <RotateTransform Angle="-90"/> </TransformGroup> </Grid.LayoutTransform> <Ellipse x:Name="circle" Fill="White" HorizontalAlignment="Center" Height="19" Stroke="#FF333333" VerticalAlignment="Center" Width="19"/> <Path x:Name="arrow" Data="M1,1.5L4.5,5 8,1.5" HorizontalAlignment="Center" SnapsToDevicePixels="False" Stroke="#FF333333" StrokeThickness="2" VerticalAlignment="Center"/> </Grid> <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="Center" Margin="0,4,0,0" Grid.Row="1" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Top"/> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="IsChecked" Value="True"> <Setter Property="Data" TargetName="arrow" Value="M1,4.5L4.5,1 8,4.5"/> </Trigger> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Stroke" TargetName="circle" Value="#FF5593FF"/> <Setter Property="Fill" TargetName="circle" Value="#FFF3F9FF"/> <Setter Property="Stroke" TargetName="arrow" Value="Black"/> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Stroke" TargetName="circle" Value="#FF3C77DD"/> <Setter Property="StrokeThickness" TargetName="circle" Value="1.5"/> <Setter Property="Fill" TargetName="circle" Value="#FFD9ECFF"/> <Setter Property="Stroke" TargetName="arrow" Value="Black"/> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Stroke" TargetName="circle" Value="#FFBCBCBC"/> <Setter Property="Fill" TargetName="circle" Value="#FFE6E6E6"/> <Setter Property="Stroke" TargetName="arrow" Value="#FF707070"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Setter.Value> </Setter> </Trigger> <Trigger Property="ExpandDirection" Value="Up"> <Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Top"/> <Setter Property="DockPanel.Dock" TargetName="HeaderSite" Value="Bottom"/> <Setter Property="Style" TargetName="HeaderSite"> <Setter.Value> <Style TargetType="{x:Type ToggleButton}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ToggleButton}"> <Border Padding="{TemplateBinding Padding}"> <Grid Background="Transparent" SnapsToDevicePixels="False"> <Grid.ColumnDefinitions> <ColumnDefinition Width="19"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Grid> <Grid.LayoutTransform> <TransformGroup> <RotateTransform Angle="180"/> </TransformGroup> </Grid.LayoutTransform> <Ellipse x:Name="circle" Fill="White" HorizontalAlignment="Center" Height="19" Stroke="#FF333333" VerticalAlignment="Center" Width="19"/> <Path x:Name="arrow" Data="M1,1.5L4.5,5 8,1.5" HorizontalAlignment="Center" SnapsToDevicePixels="False" Stroke="#FF333333" StrokeThickness="2" VerticalAlignment="Center"/> </Grid> <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Grid.Column="1" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="Left" Margin="4,0,0,0" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Center"/> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="IsChecked" Value="True"> <Setter Property="Data" TargetName="arrow" Value="M1,4.5L4.5,1 8,4.5"/> </Trigger> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Stroke" TargetName="circle" Value="#FF5593FF"/> <Setter Property="Fill" TargetName="circle" Value="#FFF3F9FF"/> <Setter Property="Stroke" TargetName="arrow" Value="Black"/> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Stroke" TargetName="circle" Value="#FF3C77DD"/> <Setter Property="StrokeThickness" TargetName="circle" Value="1.5"/> <Setter Property="Fill" TargetName="circle" Value="#FFD9ECFF"/> <Setter Property="Stroke" TargetName="arrow" Value="Black"/> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Stroke" TargetName="circle" Value="#FFBCBCBC"/> <Setter Property="Fill" TargetName="circle" Value="#FFE6E6E6"/> <Setter Property="Stroke" TargetName="arrow" Value="#FF707070"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Setter.Value> </Setter> </Trigger> <Trigger Property="ExpandDirection" Value="Left"> <Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Left"/> <Setter Property="DockPanel.Dock" TargetName="HeaderSite" Value="Right"/> <Setter Property="Style" TargetName="HeaderSite"> <Setter.Value> <Style TargetType="{x:Type ToggleButton}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ToggleButton}"> <Border Padding="{TemplateBinding Padding}"> <Grid Background="Transparent" SnapsToDevicePixels="False"> <Grid.RowDefinitions> <RowDefinition Height="19"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Grid> <Grid.LayoutTransform> <TransformGroup> <RotateTransform Angle="90"/> </TransformGroup> </Grid.LayoutTransform> <Ellipse x:Name="circle" Fill="White" HorizontalAlignment="Center" Height="19" Stroke="#FF333333" VerticalAlignment="Center" Width="19"/> <Path x:Name="arrow" Data="M1,1.5L4.5,5 8,1.5" HorizontalAlignment="Center" SnapsToDevicePixels="False" Stroke="#FF333333" StrokeThickness="2" VerticalAlignment="Center"/> </Grid> <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="Center" Margin="0,4,0,0" Grid.Row="1" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Top"/> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="IsChecked" Value="True"> <Setter Property="Data" TargetName="arrow" Value="M1,4.5L4.5,1 8,4.5"/> </Trigger> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Stroke" TargetName="circle" Value="#FF5593FF"/> <Setter Property="Fill" TargetName="circle" Value="#FFF3F9FF"/> <Setter Property="Stroke" TargetName="arrow" Value="Black"/> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Stroke" TargetName="circle" Value="#FF3C77DD"/> <Setter Property="StrokeThickness" TargetName="circle" Value="1.5"/> <Setter Property="Fill" TargetName="circle" Value="#FFD9ECFF"/> <Setter Property="Stroke" TargetName="arrow" Value="Black"/> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Stroke" TargetName="circle" Value="#FFBCBCBC"/> <Setter Property="Fill" TargetName="circle" Value="#FFE6E6E6"/> <Setter Property="Stroke" TargetName="arrow" Value="#FF707070"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Setter.Value> </Setter> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate>


Estoy de acuerdo con HTH - compruebe en qué tipo de contenedor está colocando el expansor ... el StackPanel siempre doblará sus hijos hasta el tamaño más pequeño al que puedan ir.

Estoy usando Extensores mucho en mi proyecto, y si los coloca en un Grid / DockPanel, entonces el expansor llenará todo el espacio disponible (suponiendo que las orientaciones Vertical y Horizontal estén configuradas en Estirar).

La sugerencia de Jonathan de vincular el ancho del expansor al ancho del contenedor puede ser un poco complicado ... Intenté esta técnica hace unas semanas y descubrí que puede producir resultados no deseados en algunos casos, porque puede inhibir el funcionamiento del sistema de diseño.

PD: Como sugerencia general (y estoy seguro de que me van a entusiasmar por escribir esto), si no está seguro de qué tipo de contenedor de disposición tienen sus controles, empiece con una Grilla. Usar las definiciones de columna y fila le permite controlar fácilmente si los controles secundarios usan un espacio mínimo ("Auto"), un espacio máximo ("*") o una cantidad exacta de espacio ("[número]").


La respuesta aceptada se basa fuera del control porque el contenido del encabezado está en una columna y el botón de expansión está en la primera. Podría ser lo suficientemente bueno para algunos casos.

Si desea una solución limpia, debe cambiar la plantilla del expansor.

Otra forma es una propiedad adjunta:

using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Media; public static class ParentContentPresenter { public static readonly System.Windows.DependencyProperty HorizontalAlignmentProperty = System.Windows.DependencyProperty.RegisterAttached( "HorizontalAlignment", typeof(HorizontalAlignment), typeof(ParentContentPresenter), new PropertyMetadata(default(HorizontalAlignment), OnHorizontalAlignmentChanged)); public static void SetHorizontalAlignment(this UIElement element, HorizontalAlignment value) { element.SetValue(HorizontalAlignmentProperty, value); } [AttachedPropertyBrowsableForChildren(IncludeDescendants = false)] [AttachedPropertyBrowsableForType(typeof(UIElement))] public static HorizontalAlignment GetHorizontalAlignment(this UIElement element) { return (HorizontalAlignment)element.GetValue(HorizontalAlignmentProperty); } private static void OnHorizontalAlignmentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var presenter = d.Parents().OfType<ContentPresenter>().FirstOrDefault(); if (presenter != null) { presenter.HorizontalAlignment = (HorizontalAlignment) e.NewValue; } } private static IEnumerable<DependencyObject> Parents(this DependencyObject child) { var parent = VisualTreeHelper.GetParent(child); while (parent != null) { yield return parent; child = parent; parent = VisualTreeHelper.GetParent(child); } } }

Te permite hacer:

<Expander Header="{Binding ...}"> <Expander.HeaderTemplate> <DataTemplate> <!--Using a border here to show how width changes--> <Border BorderBrush="Red" BorderThickness="1" local:ParentContentPresenter.HorizontalAlignment="Stretch"> ... </Border> </DataTemplate> </Expander.HeaderTemplate> </Expander>

Tenga en cuenta que el uso de la propiedad adjunta es algo frágil, ya que asume que hay un ContentPresenter en la plantilla.


Silverlight Toolkit incluye un control de Accordion que actúa como un expansor que siempre se extiende hasta el espacio disponible. Aún no lo he probado, pero también podría ser funcional para WPF, al igual que los controles del gráfico de Silverlight.



Expander no extensible s suele ser el problema de los controles primarios no extensibles. ¿Tal vez uno de los controles primarios haya definido una propiedad HorizontalAlignment o VerticalAlignment ?

Si puede publicar un código de muestra, podemos darle una mejor respuesta.


<Expander Name="EXPANDER_NAME"> <Expander IsExpanded="True" Margin="0"> <Expander.Header> <Grid Background="Red" Width="{Binding ElementName=EXPANDER_NAME, Path=ActualWidth}"> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition Width="30"/> </Grid.ColumnDefinitions> <TextBlock> HEADER TEXT <TextBlock> </Grid> </Expander.Header> </Expander>