2010-09-15 21 views
18

Estoy intentando modificar mi control simple para que el cuadro de texto no crezca a medida que el usuario escribe en texto largo. Eché un vistazo a algunas soluciones publicadas aquí en Stackoverflow que sugieren el uso de una cuadrícula y un borde invisible y vinculando el ancho del cuadro de texto al ancho real del borde, pero parece que no puedo hacer que funcione en mi configuración.Detener que WPF TextBox crezca con el texto

Aquí es 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> 

¿Alguna idea? Necesito el zoom.png para que aparezca "dentro" del cuadro de texto, así que utilizo un panel de pila horizontal y simplemente coloco la imagen y el cuadro de texto uno al lado del otro, ambos rodeados por el mismo borde.

¿Hay alguna manera de evitar que mi cuadro de texto aumente automáticamente mientras se escribe el texto?

Gracias.

ACTUALIZACIÓN:

A continuación se muestra el código XAML que estoy probando con.

<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 la ventana.

Respuesta

14

he hecho 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 automáticamente en la entrada larga del usuario. Gracias a todos los que investigaron 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> 
+0

Gracias. Intenté esto y funcionó con un defecto para mí. No se puede usar si usa un scrollviewer. Originalmente tenía uno y lo que estaba sucediendo es que el cuadro de texto creció cuando la interfaz de usuario creció, pero no se achicaría cuando la IU se redujo. – famousKaneis

+1

@nameless Tienes que establecer 'HorizontalScrollBarVisibility =" False "' para tu Scrollviewer para que tu Textbox siga el ancho de la ventana a medida que se encoge. – M463

+0

Esto debería haberse arreglado en WPF si esta es la única solución real ... (No he encontrado nada mejor todavía y estamos en 2016 ...) – Arwin

0

Para escalar el borde que contiene el cuadro de texto al ancho del panel de la pila exterior, cambie el panel de pila interno a una cuadrícula y establezca un margen izquierdo en el cuadro de texto para que no se superponga con la imagen. Establezca también la alineación horizontal de la imagen a la izquierda (si es que la quiere) o de forma predeterminada al 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> 
+0

Gracias. Estaba buscando una forma de hacerlo sin establecer tamaños explícitos, pero podría necesitar hacerlo de esta manera si no puedo encontrar una solución. – Flack

+0

@Flack: ¿Quería que escalara para completar algún área específica bajo su control? – PhilB

+0

@PhilB: en este momento, creo que el cuadro de texto siempre tendrá un tamaño constante, pero eso puede cambiar en el futuro. Solo quería evitar los tamaños de codificación difíciles, ya que parece ser una forma de ganar que debería evitarse si es posible en WPF. Así que, básicamente, quiero que mi StackPanel con la imagen y el cuadro de texto sea tan ancho como mi WrapPanel que contiene los dos bloques de texto. – Flack

0

Para detener el comportamiento de cultivo establecido un tamaño explícita al cuadro de texto ni lo coloque en una cuadrícula con HorizontalAlignment establecido para estirar

Opción 1:

<TextBox Width="60">THIS IS SOME TEXT</TextBox> 

Opción 2 :

<TextBox HorizontalAlignment="Stretch">THIS IS SOME TEXT</TextBox> 
+1

¿Puedes publicar cómo se vería el xaml? Traté de envolver el cuadro de texto en una cuadrícula y configurar la Alineación Horizontal del cuadro de texto para Estirar, pero eso no impidió que el cuadro de texto creciera a medida que se escribía el texto. (También intenté establecer la Alineación Horizontal de la Rejilla para Estirar en caso de que no entendiera, pero el resultado fue el mismo.) – Flack

5

Nombre de la cuadrícula como x:Name="grdTest" y probar este

<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> 
+0

Hola Kishore. Ata el ancho del cuadro de texto al ancho de la cuadrícula y el cuadro de texto no crece a medida que escribo, pero ahora cuando pongo el control de usuario en una ventana (como agregarlo a un panel de ajuste en una ventana) siempre ocupa todo el ancho de la ventana ¿Hay alguna manera de limitarlo al ancho del panel de ajuste que contiene los dos bloques de texto? – Flack

+0

¿puedes compartir el xaml? –

+0

He actualizado mi publicación original para incluir el xaml con el que estoy probando. – Flack

5

Intenta poner ScrollViewer.HorizontalScrollBarVisibility="Disabled" dentro de la rejilla.

+0

Esta es la mejor respuesta. – Arwin

Cuestiones relacionadas