2010-09-15 13 views
18

Sto tentando di modificare il mio controllo semplice in modo che la casella di testo non cresca man mano che l'utente digita il testo lungo. Ho dato un'occhiata ad alcune soluzioni pubblicate qui su Stackoverflow che suggeriscono di utilizzare una griglia e un bordo invisibile e di legare la larghezza della casella di testo alla larghezza effettiva del bordo, ma non riesco a farlo funzionare nella mia configurazione.Arresto del TextBox WPF dal crescere con il testo

Ecco la XAML del mio controllo:

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

Tutte le idee? Ho bisogno di zoom.png per apparire "all'interno" della casella di testo, quindi utilizzo un pannello di pila orizzontale e posiziono l'immagine e la casella di testo affiancate, entrambe circondate dallo stesso bordo.

C'è un modo per impedire alla mia casella di testo di crescere automaticamente man mano che il testo viene digitato?

Grazie.

UPDATE:

Di seguito è riportato il codice XAML sto testando 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> 

Ho solo aggiunto il mio controllo utente a MainRegion di Windows.

risposta

14

ho fatto un po 'di ricerca e trovato la soluzione. Ho usato la Grid sotto per sostituire la griglia nel mio post originale e ora la casella di testo mantiene le sue dimensioni originali e non cresce automaticamente all'input dell'utente lungo. Grazie a tutti coloro che hanno esaminato questo.

 <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

Grazie. Ho provato questo e ha funzionato con un difetto per me. Non può essere utilizzato se si utilizza un scrollviewer. Originariamente ne avevo uno e quello che stava succedendo è che la casella di testo è cresciuta quando l'interfaccia utente è cresciuta, ma non si sarebbe ristretta quando l'interfaccia utente si è ridotta. – famousKaneis

+1

@nameless Devi impostare 'HorizontalScrollBarVisibility =" False "' per il tuo Scrollviewer per far sì che la tua casella di testo segua la larghezza della finestra man mano che si riduce. – M463

+0

Questo dovrebbe essere stato corretto in WPF se questa è l'unica soluzione reale ... (Non ho trovato niente di meglio ancora e siamo nel 2016 ...) – Arwin

0

Per ridimensionare il bordo contenente la casella di testo alla larghezza del pannello di pila esterna, modificare il pannello di pila interna in una griglia e impostare un margine sinistro sulla casella di testo in modo che non si sovrapponga all'immagine. Imposta anche l'allineamento orizzontale dell'immagine a sinistra (se è dove lo vuoi) o si imposta automaticamente al centro del bordo.

 <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

Grazie. Stavo cercando un modo per farlo senza impostare dimensioni esplicite, ma potrei aver bisogno di farlo in questo modo se non riesco a trovare una soluzione. – Flack

+0

@Ingresso: vuoi ridimensionarlo per riempire un'area specifica nel tuo controllo? – PhilB

+0

@PhilB: In questo momento penso che la casella di testo sarà sempre una dimensione costante, ma potrebbe cambiare in futuro. Volevo solo evitare le dimensioni dei codici rigidi in quanto sembra una cosa da winforms che dovrebbe essere evitata se possibile in WPF. Quindi, in pratica, voglio che il mio StackPanel con l'immagine e la casella di testo sia largo quanto il mio WrapPanel che contiene i due blocchi di testo. – Flack

0

Per interrompere il comportamento crescere impostare un formato esplicito TextBox o collocarlo in una griglia con la HorizontalAlignment impostato allungare

Opzione 1:

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

Opzione 2 :

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

Puoi postare l'aspetto del xaml? Ho provato a racchiudere la casella di testo in una griglia e impostare HorizontalAlignment della casella di testo su Stretch ma ciò non ha impedito che la casella di testo crescesse man mano che il testo veniva digitato. (Ho anche provato a impostare l'allineamento orizzontale della griglia su Stretch nel caso in cui avessi frainteso, ma il risultato era lo stesso.) – Flack

5

Nome della griglia come x:Name="grdTest" e provare questo

<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

Hey Kishore. Ho rilegato la larghezza della casella di testo alla larghezza della griglia e la casella di testo non cresce man mano che digito, ma ora quando inserisco il controllo utente in una finestra (come aggiungerla a un pannello di wrap in una finestra) occupa sempre l'intero larghezza della finestra. C'è un modo per limitarsi alla larghezza del pannello di wrap che contiene i due blocchi di testo? – Flack

+0

puoi condividere lo xaml? –

+0

Ho aggiornato il mio post originale per includere lo xaml con cui sto testando. – Flack

5

Provare a inserire ScrollViewer.HorizontalScrollBarVisibility="Disabled" all'interno della griglia.

+0

Questa è la migliore risposta. – Arwin