Прекращение использования 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 окна.
Ответы
Ответ 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