Подтвердить что ты не робот

Прекращение использования TextBox WPF с текстом

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

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

4b9b3361

Ответ 1

Я сделал еще несколько поисков и нашел решение. Я использовал приведенную ниже таблицу 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>

Ответ 2

Назовите сетку как 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> 

Ответ 3

Попробуйте установить ScrollViewer.HorizontalScrollBarVisibility="Disabled" внутри Grid.

Ответ 4

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

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

Ответ 5

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

Вариант 1:

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

Вариант 2:

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

Ответ 6

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