2010-09-15 56 views
18

我想修改我的簡單控件,以便文本框不會隨着用戶鍵入長文本而增長。我看了一下在Stackoverflow發佈的一些解決方案,這些解決方案建議使用網格和不可見的邊框,並將文本框的寬度綁定到邊框的ActualWidth,但我似乎無法讓它在我的設置中工作。停止WPF文本框與文本增長

這是我控制的XAML:

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

任何想法?我需要zoom.png出現在文本框的「內部」,所以我使用水平堆疊面板,並將圖像和文本框並排放置,兩者都被相同的邊框包圍。

有沒有一種方法可以讓我停止自動增長文本框的文本輸入?

謝謝。

UPDATE:

下面是我與測試XAML。

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

我只是將我的用戶控件添加到窗口的MainRegion。

回答

14

我做了一些更多的搜索,找到了解決辦法。我使用下面的Grid替換原始文章中的網格,現在文本框保持其原始大小,並且不會在長用戶輸入時自動增長。感謝所有看過這個的人。

 <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

謝謝。我試過這個,它對我有一個缺陷。如果您使用滾動查看器,則無法使用它。我原來有一個,發生的事情是,當用戶界面增長時,文本框增長,但當用戶界面縮小時不會縮小。 – famousKaneis 2015-06-01 17:08:28

+1

@nameless你必須爲你的滾動查看器設置'Horizo​​ntalScrollBarVisibility =「False」'讓你的文本框在縮小時跟隨窗口寬度。 – M463 2015-07-30 14:03:06

+0

如果這是唯一真正的解決方案,這應該在WPF本身中得到修復......(我自己還沒找到更好的東西,而且我們在2016年......) – Arwin 2016-03-16 19:13:19

0

要將包含文本框的邊框縮放到outter堆棧面板的寬度,請將內部堆棧面板更改爲網格,並在文本框上設置左邊距,使其不與圖像重疊。還要將圖像的水平對齊設置爲左側(如果這是您想要的位置),或者它將默認爲邊框的中心。

 <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

謝謝。我正在尋找一種不設置明確尺寸的方法,但如果我找不到解決方案,我可能需要這樣做。 – Flack 2010-09-15 20:41:32

+0

@Flack:你是否想要擴展以在控件中填充某個特定區域? – PhilB 2010-09-15 20:58:08

+0

@PhilB:現在我認爲文本框的大小始終是一個常數,但在將來可能會改變。我只是想避免硬編碼的大小,因爲這似乎是一個winform的東西,如果可能的話應該避免在WPF中。所以基本上,我希望我的StackPanel的圖像和文本框的寬度與包含兩個文本塊的WrapPanel一樣寬。 – Flack 2010-09-15 21:49:26

0

要停止成長的行爲明確的大小設置爲文本框或設置舒展的Horizo​​ntalAlignment其放置在一個網格

選項1:

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

選項2 :

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

你可以發佈xaml的樣子嗎?我嘗試在文本框中包裝文本框,並將文本框的Horizo​​ntalAlignment設置爲Stretch,但這並不妨礙文本框隨文本輸入而增長。 (我也嘗試將Grid的Horizo​​ntalAlignment設置爲Stretch,以防我誤解,但結果相同。) – Flack 2010-09-15 20:40:43

5

名稱網格爲x:Name="grdTest"和嘗試這個

<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。我將文本框寬度綁定到網格的寬度,文本框不會像我輸入時那樣增長,但現在,當我將用戶控件放入窗口中時(例如將其添加到窗口中的包裝面板),它總是佔用整個窗戶的寬度。有沒有辦法限制包含兩個文本塊的包裝面板的寬度? – Flack 2010-09-16 18:56:34

+0

你能分享xaml嗎? – 2010-09-17 04:58:44

+0

我已更新我的原始文章,以包括我正在測試的xaml。 – Flack 2010-09-17 12:57:29

5

嘗試將ScrollViewer.HorizontalScrollBarVisibility="Disabled"放入Grid中。

+0

這是最好的答案。 – Arwin 2016-03-17 22:38:23