2010-09-15 39 views
18

Tôi đang cố sửa đổi điều khiển đơn giản của mình để hộp văn bản không phát triển khi người dùng nhập văn bản dài. Tôi đã xem xét một số giải pháp được đăng ở đây tại Stackoverflow đề xuất sử dụng Grid và một Border vô hình và liên kết Width của hộp văn bản với ActualWidth của Border, nhưng tôi không thể làm cho nó hoạt động trong thiết lập của mình.Dừng WPF TextBox phát triển với văn bản

Đây là XAML tầm kiểm soát của tôi:

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

Bất kỳ ý tưởng? Tôi cần zoom.png xuất hiện "bên trong" của hộp văn bản để tôi sử dụng bảng điều khiển ngăn xếp ngang và chỉ đặt hộp hình ảnh và văn bản cạnh nhau, cả hai được bao quanh bởi cùng một đường viền.

Có cách nào để tôi dừng hộp văn bản tự động phát triển khi nhập văn bản không?

Cảm ơn.

UPDATE:

Dưới đây là XAML Tôi đang thử nghiệm với.

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

Tôi chỉ thêm điều khiển người dùng vào MainRegion của Window.

Trả lời

14

tôi đã làm một số tìm kiếm hơn và tìm thấy giải pháp. Tôi đã sử dụng Lưới dưới đây để thay thế lưới trong bài đăng gốc của tôi và giờ đây hộp văn bản giữ nguyên kích thước ban đầu của nó và không tự động phát triển trên đầu vào người dùng dài. Cảm ơn tất cả những ai đã xem xét điều này.

 <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

Cảm ơn. Tôi đã thử điều này và nó đã làm việc với một lỗ hổng cho tôi. Nó không thể được sử dụng nếu bạn sử dụng một scrollviewer. Ban đầu tôi đã có một và những gì đã xảy ra là hộp văn bản đã tăng lên khi giao diện người dùng tăng lên nhưng sẽ không co lại khi giao diện người dùng bị thu hẹp. – famousKaneis

+1

@nameless Bạn phải đặt 'HorizontalScrollBarVisibility =" False "' cho Scrollviewer của bạn để có được Textbox của bạn theo chiều rộng của cửa sổ khi nó co lại. – M463

+0

Điều này cần phải được sửa trong WPF nếu đây là giải pháp thực sự duy nhất ... (Tôi đã không tìm thấy bất cứ điều gì tốt hơn bản thân mình và chúng tôi đang trong năm 2016 ...) – Arwin

0

Để chia tỷ lệ đường viền chứa hộp văn bản thành chiều rộng của bảng xếp chồng, hãy thay bảng điều khiển ngăn xếp bên trong thành lưới và đặt lề trái trên hộp văn bản sao cho nó không trùng với hình ảnh. Đồng thời đặt căn chỉnh ngang của hình ảnh sang trái (nếu đó là nơi bạn muốn) hoặc nó sẽ mặc định ở giữa đường viền.

 <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

Cảm ơn. Tôi đã tìm kiếm một cách để làm điều đó mà không cần thiết lập kích thước rõ ràng, nhưng tôi có thể cần phải làm điều đó theo cách này nếu tôi không thể tìm thấy một giải pháp. – Flack

+0

@Flack: Bạn có muốn nó mở rộng để điền vào một số khu vực cụ thể trong tầm kiểm soát của bạn không? – PhilB

+0

@PhilB: Ngay bây giờ tôi nghĩ rằng hộp văn bản sẽ luôn luôn là một kích thước không đổi, nhưng điều đó có thể thay đổi trong tương lai. Tôi chỉ muốn tránh các kích thước mã hóa cứng vì điều đó có vẻ giống như một điều winforms cần tránh nếu có thể trong WPF. Vì vậy, về cơ bản, tôi muốn StackPanel của tôi với hình ảnh và hộp văn bản được rộng như WrapPanel của tôi có chứa hai khối văn bản. – Flack

0

Để ngăn chặn các hành vi nuôi thiết lập một kích thước rõ ràng cho TextBox hoặc đặt nó trong một mạng lưới với HorizontalAlignment thiết lập để căng

Lựa chọn 1:

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

Lựa chọn 2 :

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

Bạn có thể đăng những gì xaml sẽ như thế nào? Tôi đã thử gói các hộp văn bản trong một lưới và thiết lập HorizontalAlignment của hộp văn bản để Stretch nhưng điều đó đã không ngăn chặn các hộp văn bản phát triển như văn bản đã được gõ. (Tôi cũng đã thử thiết lập HorizontalAlignment của Grid thành Stretch trong trường hợp tôi hiểu lầm nhưng kết quả là như nhau.) – Flack

5

Tên Grid như x:Name="grdTest" và cố gắng này

<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. Tôi đã giới hạn chiều rộng của hộp văn bản thành chiều rộng của lưới và hộp văn bản không tăng khi tôi nhập nhưng bây giờ khi tôi đặt điều khiển người dùng trong cửa sổ (chẳng hạn như thêm nó vào bảng điều khiển bọc trong cửa sổ), nó luôn chiếm toàn bộ chiều rộng của cửa sổ. Có cách nào để giới hạn độ rộng của bảng điều khiển bao gồm hai khối văn bản không? – Flack

+0

bạn có thể chia sẻ xaml không? –

+0

Tôi đã cập nhật bài đăng gốc của mình để bao gồm xaml tôi đang thử nghiệm. – Flack

5

Hãy thử đặt ScrollViewer.HorizontalScrollBarVisibility="Disabled" bên trong lưới.

+0

Đây là câu trả lời hay nhất. – Arwin

0

Bài viết này hiển thị giải pháp cho hộp văn bản được hiển thị bên trong chế độ xem của trình xem cuộn (trong chế độ xem tre hoặc hộp danh sách). Một PART_MeasureTextBlock được sử dụng (liên kết với hộp văn bản) để xác định kích thước có sẵn và đặt nó vào hộp văn bản. Vui lòng xem tại đây và cho tôi biết suy nghĩ của bạn về điều đó: http://www.codeproject.com/Articles/802385/A-WPF-MVVM-In-Place-Edit-TextBox-Control

Các vấn đề liên quan