2010-09-15 1 views
18

Ich versuche, mein einfaches Steuerelement zu ändern, so dass das Textfeld nicht wächst, wie der Benutzer langen Text eingibt. Ich habe mir einige Lösungen hier bei Stackoverflow angeschaut, die vorschlagen, ein Gitter und einen unsichtbaren Rahmen zu verwenden und die Breite des Textfelds an die tatsächliche Breite des Rahmens zu binden, aber ich kann nicht scheinen, dass es in meinem Setup funktioniert. HierStoppen WPF TextBox von mit Text wachsen

ist die XAML meiner Kontrolle:

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

Irgendwelche Ideen? Ich brauche die zoom.png, um "innerhalb" des Textfelds zu erscheinen, also verwende ich ein horizontales Stapelpanel und platziere das Bild und das Textfeld nebeneinander, beide von demselben Rand umgeben.

Gibt es eine Möglichkeit für mich, meine Textbox daran zu hindern, automatisch zu wachsen, wenn Text eingegeben wird?

Danke.

UPDATE:

Unten ist die XAML ich mit dem Testen bin.

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

Ich füge einfach meine Benutzersteuerung zum MainRegion des Fensters.

Antwort

14

ich etwas mehr Such tat und die Lösung gefunden. Ich habe das folgende Raster verwendet, um das Raster in meinem ursprünglichen Beitrag zu ersetzen. Jetzt behält das Textfeld seine ursprüngliche Größe bei und wächst nicht automatisch bei langen Benutzereingaben an. Danke an alle, die sich das angeschaut haben.

 <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

Danke. Ich habe es versucht und es hat mit einem Fehler für mich funktioniert. Es kann nicht verwendet werden, wenn Sie einen Scrollviewer verwenden. Ich hatte ursprünglich eine und was passierte, ist, dass die Textbox wuchs, als die Benutzeroberfläche wuchs, aber nicht schrumpfte, wenn die Benutzeroberfläche geschrumpft wurde. – famousKaneis

+1

@nameless Sie müssen 'HorizontalScrollBarVisibility =" False "für Ihren Scrollviewer festlegen, damit Ihre Textbox der Verkleinerung der Fensterbreite folgt. – M463

+0

Dies sollte in WPF selbst behoben worden sein, wenn dies die einzige wirkliche Lösung ist ... (Ich habe noch nichts Besseres gefunden und wir sind 2016 ...) – Arwin

0

Um den Rahmen, der das Textfeld enthält, auf die Breite des äußeren Stackpanels zu skalieren, ändern Sie das innere Stackpanel in ein Raster und legen Sie einen linken Rand für das Textfeld fest, damit es nicht mit dem Bild überlappt. Stellen Sie auch die horizontale Ausrichtung des Bildes nach links ein (wenn Sie dies wünschen) oder auf die Mitte des Rahmens.

 <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

Danke. Ich habe nach einem Weg gesucht, dies zu tun, ohne explizite Größen zu setzen, aber ich muss es vielleicht auf diese Weise machen, wenn ich keine Lösung finden kann. – Flack

+0

@Flack: Wollte es skalieren, um einen bestimmten Bereich in Ihrer Steuerung auszufüllen? – PhilB

+0

@PhilB: Im Moment denke ich, dass die Textbox immer eine konstante Größe haben wird, aber das könnte sich in Zukunft ändern. Ich wollte nur harte Coding-Größen vermeiden, da dies wie eine Winform-Sache aussieht, die wenn möglich in WPF vermieden werden sollte. Im Grunde genommen möchte ich, dass mein StackPanel mit Bild und Textfeld so breit ist wie mein WrapPanel, das die beiden Textblöcke enthält. – Flack

0

das wachsen Verhalten zu stoppen eine explizite Größe das TextBox gesetzt oder in einem Raster Platz mit der Horizontal gesetzt

Option 1 zu strecken:

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

Option 2 :

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

Kannst du posten, wie der Xaml aussehen würde? Ich habe versucht, das Textfeld in einem Raster zu umbrechen und die horizontale Ausrichtung des Textfelds auf "Stretch" zu setzen, aber das hat nicht verhindert, dass das Textfeld bei der Texteingabe anwuchs. (Ich habe auch versucht, die horizontale Ausrichtung des Rasters auf Dehnung einzustellen, falls ich es falsch verstanden habe, aber das Ergebnis war dasselbe.) – Flack

5

Nennen Sie das Gitter als x:Name="grdTest" und versuchen, diese

<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. Ich habe die Breite des Textfelds an die Breite des Rasters gebunden, und das Textfeld wird nicht größer, während ich das Steuerelement in ein Fenster einfüge (z. B. das Hinzufügen zu einem Fenster in einem Fenster) Breite des Fensters. Gibt es eine Möglichkeit, sie auf die Breite des Wrap-Panels zu beschränken, das die beiden Textblöcke enthält? – Flack

+0

können Sie die XAML teilen? –

+0

Ich habe meinen ursprünglichen Beitrag aktualisiert, um das Xaml, mit dem ich teste, mit einzuschließen. – Flack

5

Versuchen Sie ScrollViewer.HorizontalScrollBarVisibility="Disabled" ins Grid zu setzen.

+0

Dies ist die beste Antwort. – Arwin