wpf: выделение текста в TextBox с IsReadOnly = true?
У меня есть этот TextBox. Этот TextBox находится в DataTemplate:
<DataTemplate x:Key="myTemplate">
<TextBox Text="{Binding Path=FullValue, Mode=TwoWay}" IsEnabled="False" />
...
и я хочу позволить пользователю выбрать весь текст внутри него (по желанию, нажав на текстовое поле). И я не хочу использовать какой-либо код позади.
Как это сделать? Заранее спасибо.
4 ответа
Использование свойства IsReadOnly вместо IsEnabled позволяет пользователю выбирать текст. Кроме того, если это не нужно редактировать, привязки OneWay должно быть достаточно.
Идея XAML состоит не в том, чтобы полностью заменить код позади. Наиболее важным является то, что вы пытаетесь иметь только специфичный для пользовательского интерфейса код в коде позади, а не бизнес-логику. При этом, выбор всего текста зависит от пользовательского интерфейса и не повредит в коде позади. Для этого используйте myTextBox.SelectAll().
Одна заметка, которую я только что обнаружил (очевидно, это старый вопрос, но это может кому-то помочь):
Если IsHitTestVisible=False
затем выбор (и, следовательно, копирование) также отключен.
Удаление IsEnabled и установка TextBox в ReadOnly позволит вам выбрать текст, но остановить ввод пользователя.
IsReadOnly="True"
Единственная проблема с этим подходом состоит в том, что, хотя вы не сможете печатать в TextBox, он все равно будет выглядеть "Включен".
Чтобы обойти это (если хотите?), Вы можете просто добавить стиль, чтобы осветлить текст и затемнить фон (чтобы он выглядел отключенным).
Я добавил следующий пример со стилем, который будет перемещать текстовое поле между отключенным и включенным внешним видом.
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="IsReadOnly" Value="True">
<Setter Property="Background" Value="LightGray" />
</Trigger>
<Trigger Property="IsReadOnly" Value="True">
<Setter Property="Foreground" Value="DarkGray" />
</Trigger>
<Trigger Property="IsReadOnly" Value="False">
<Setter Property="Background" Value="White" />
</Trigger>
<Trigger Property="IsReadOnly" Value="False">
<Setter Property="Foreground" Value="Black" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<TextBox Height="23" Margin="25,22,133,0" IsReadOnly="True" Text="monkey" Name="textBox1" VerticalAlignment="Top" />
<Button Height="23" Margin="25,51,133,0" Name="button1" VerticalAlignment="Top" Click="button1_Click">Button</Button>
</Grid>
private void button1_Click(object sender, RoutedEventArgs e)
{
textBox1.IsReadOnly = !textBox1.IsReadOnly;
}
Слегка измененный пример - чтобы соответствовать стилю WinForms (не придумывать свой новый стиль)
By adding <Window.Resources> after <Window> and before <Grid> will make your text box behave like normal winforms textbox.
<Window x:Class="..." Height="330" Width="600" Loaded="Window_Loaded" WindowStartupLocation="CenterOwner">
<Window.Resources>
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="IsReadOnly" Value="True">
<Setter Property="Background" Value="LightGray" />
</Trigger>
<Trigger Property="IsReadOnly" Value="False">
<Setter Property="Background" Value="White" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
И, конечно, в вашем текстовом поле должен быть установлен атрибут IsReadOnly="True".