Запрещение WPF TextBox расти с текстом - PullRequest
19 голосов
/ 15 сентября 2010

Я пытаюсь изменить свой простой элемент управления, чтобы текстовое поле не увеличивалось по мере того, как пользователь вводит длинный текст. Я взглянул на некоторые решения, размещенные здесь в Stackoverflow, которые предлагают использовать Grid и невидимую границу и привязать ширину текстового поля к ActualWidth of Border, но я не могу заставить его работать в моих настройках.

Вот 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 окна.

Ответы [ 6 ]

15 голосов
/ 20 сентября 2010

Я провел еще несколько поисков и нашел решение.Я использовал приведенную ниже сетку, чтобы заменить сетку в исходном сообщении, и теперь текстовое поле сохраняет свой первоначальный размер и не увеличивается автоматически при длительном вводе пользователем.Спасибо всем, кто заглянул в это.

      <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>
8 голосов
/ 27 декабря 2010

Попробуйте поместить ScrollViewer.HorizontalScrollBarVisibility="Disabled" в сетку.

6 голосов
/ 16 сентября 2010

Назовите сетку как 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 голосов
/ 31 июля 2014

В этой статье показано решение для текстового поля, которое отображается внутри окна просмотра пользователя прокрутки (в виде дерева или списка). PART_MeasureTextBlock используется (привязан к текстовому полю), чтобы определить доступный размер и установить его в текстовое поле. Пожалуйста, посмотрите здесь и скажите мне, что вы думаете об этом: http://www.codeproject.com/Articles/802385/A-WPF-MVVM-In-Place-Edit-TextBox-Control

0 голосов
/ 15 сентября 2010

Чтобы остановить поведение роста, установите явный размер для TextBox или поместите его в сетку с параметром HorizontalAlignment, чтобы растянуть

Вариант 1:

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

Вариант 2:

<TextBox HorizontalAlignment="Stretch">THIS IS SOME TEXT</TextBox>
0 голосов
/ 15 сентября 2010

Чтобы масштабировать границу, содержащую текстовое поле, по ширине панели внешнего стека, измените внутреннюю панель стека на сетку и установите левое поле для текстового поля, чтобы оно не перекрывалось с изображением.Также установите горизонтальное выравнивание изображения влево (если оно там, где вы хотите), иначе оно будет по умолчанию в центре границы.

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