example - Deteniendo que WPF TextBox crezca con texto
wpf layout (6)
Estoy intentando modificar mi control simple para que el cuadro de texto no crezca a medida que el usuario escribe texto largo. Eché un vistazo a algunas de las soluciones publicadas aquí en Stackoverflow que sugieren usar una cuadrícula y un borde invisible y vincular el ancho del cuadro de texto al Ancho real del borde, pero parece que no puedo hacer que funcione en mi configuración.
Aquí está el xaml de mi control:
<StackPanel Margin="5,0">
<WrapPanel Margin="0,0,0,5">
<TextBlock Foreground="White" Margin="0,0,2,0">TEXT</TextBlock>
<TextBlock Foreground="#FF0099CC" FontWeight="Bold">MORE TEXT</TextBlock>
</WrapPanel>
<Border Margin="2,4,0,4" BorderThickness="1" SnapsToDevicePixels="True" Background="Black"
BorderBrush="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}">
<StackPanel Orientation="Horizontal">
<Image Source="../Resources/zoom.png" Width="13"/>
<TextBox Foreground="White" Background="Black" BorderBrush="Transparent">THIS IS SOME TEXT</TextBox>
</StackPanel>
</Border>
</StackPanel>
¿Algunas ideas? Necesito que el zoom.png aparezca "dentro" del cuadro de texto, así que uso un panel de pila horizontal y solo coloco la imagen y el cuadro de texto lado a lado, ambos rodeados por el mismo borde.
¿Hay alguna manera de evitar que mi cuadro de texto crezca automáticamente a medida que se escribe?
Gracias.
ACTUALIZAR:
A continuación se muestra el xaml con el que estoy probando.
<Window x:Class="Desktop.Shell"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:composite="http://www.codeplex.com/CompositeWPF"
Title="MyShell" Height="50" Width="900"
WindowStyle="None"
ShowInTaskbar="False"
AllowsTransparency="True"
Background="Transparent"
ResizeMode="CanResizeWithGrip"
WindowStartupLocation="CenterScreen">
<Border BorderBrush="Black"
BorderThickness="1.5"
CornerRadius="5"
Background="Gray">
<ItemsControl composite:RegionManager.RegionName="MainRegion">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel></WrapPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Border>
</Window>
<UserControl x:Class="Desktop.SearchTextBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="50" Margin="0">
<StackPanel Margin="5,0">
<WrapPanel Margin="0,0,0,5">
<TextBlock Foreground="White" Margin="0,0,2,0">TEXT</TextBlock>
<TextBlock Foreground="#FF0099CC" FontWeight="Bold">MORE TEXT</TextBlock>
</WrapPanel>
<Border Margin="2,4,0,4" BorderThickness="1" SnapsToDevicePixels="True" Background="Black"
BorderBrush="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}">
<Grid x:Name="grdTest">
<Image HorizontalAlignment="Left" Source="../Resources/zoom.png" Width="13"/>
<TextBox Margin="16,0,0,0" Foreground="White" Background="Black" BorderBrush="Transparent" Width="{Binding ElementName=grdTest, Path=ActualWidth}">THIS IS SOME TEXT</TextBox>
</Grid>
</Border>
</StackPanel>
</UserControl>
Acabo de agregar mi control de usuario a la MainRegion de Windows.
Este artículo muestra una solución para un cuadro de texto que se muestra dentro de la ventana gráfica de un visor de desplazamiento (en vista de árbol o cuadro de lista). Se utiliza un PART_MeasureTextBlock (vinculado al cuadro de texto) para determinar el tamaño disponible y establecerlo en el cuadro de texto. Por favor, mire aquí y dígame qué piensa al respecto: http://www.codeproject.com/Articles/802385/A-WPF-MVVM-In-Place-Edit-TextBox-Control
Hice un poco más de búsqueda y encontré la solución. Utilicé la cuadrícula de abajo para reemplazar la cuadrícula en mi publicación original y ahora el cuadro de texto mantiene su tamaño original y no crece de forma automática con las aportaciones largas de los usuarios. Gracias a todos los que miraron esto.
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Image Source="../Resources/zoom.png" Width="13"/>
<Border x:Name="b" Grid.Column="1"/>
<TextBox Width="{Binding ActualWidth, ElementName=b}" Foreground="White" Background="Black" BorderBrush="Transparent"
Grid.Column="1"
VerticalAlignment="Center"
Text="THIS IS SOME TEXT"/>
</Grid>
Intente colocar ScrollViewer.HorizontalScrollBarVisibility="Disabled"
dentro de Grid.
Nombra la cuadrícula como x:Name="grdTest"
y prueba esto
<Grid x:Name="grdTest">
<Image HorizontalAlignment="Left" Source="../Resources/zoom.png" Width="13"/>
<TextBox Margin="16,0,0,0" Foreground="White" Background="Black" BorderBrush="Transparent"
Width="{Binding ElementName=grdTest, Path=ActualWidth}">THIS IS SOME TEXT</TextBox>
</Grid>
Para detener el comportamiento de crecimiento, establezca un tamaño explícito en TextBox o colóquelo en una cuadrícula con el HorizontalAlignment establecido para estirar
Opción 1:
<TextBox Width="60">THIS IS SOME TEXT</TextBox>
Opcion 2:
<TextBox HorizontalAlignment="Stretch">THIS IS SOME TEXT</TextBox>
Para escalar el borde que contiene el cuadro de texto al ancho del panel de la pila exterior, cambie el panel de la pila interior a una cuadrícula y establezca un margen izquierdo en el cuadro de texto para que no se superponga con la imagen. También establezca la alineación horizontal de la imagen a la izquierda (si es donde lo desea) o se establecerá de manera predeterminada en el centro del borde.
<StackPanel Margin="5,0">
<WrapPanel Margin="0,0,0,5">
<TextBlock Foreground="White" Margin="0,0,2,0">TEXT</TextBlock>
<TextBlock Foreground="#FF0099CC" FontWeight="Bold">MORE TEXT</TextBlock>
</WrapPanel>
<Border Margin="2,4,0,4" BorderThickness="1" SnapsToDevicePixels="True" Background="Black"
BorderBrush="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}">
<Grid>
<Image HorizontalAlignment="Left" Source="../Resources/zoom.png" Width="13"/>
<TextBox Margin="16,0,0,0" Foreground="White" Background="Black" BorderBrush="Transparent">THIS IS SOME TEXT</TextBox>
</Grid>
</Border>
</StackPanel>