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

Wpf: выбор текста в TextBox с помощью IsReadOnly = true?

У меня есть этот TextBox. Этот TextBox находится в DataTemplate:

<DataTemplate x:Key="myTemplate">
    <TextBox  Text="{Binding Path=FullValue, Mode=TwoWay}" IsEnabled="False"  />
       ...

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

Как это сделать? Спасибо заранее.

4b9b3361

Ответ 1

Использование свойства IsReadOnly вместо IsEnabled позволяет пользователю выбирать текст. Кроме того, если он не должен быть отредактирован, привязка OneWay должна быть достаточной.

Идея XAML заключается не в том, чтобы полностью заменить код. Самое главное, что вы пытаетесь использовать только код, специфичный для пользовательского интерфейса, в коде, а не в бизнес-логике. При этом выбор всего текста зависит от пользовательского интерфейса и не повреждает код. Для этого используйте myTextBox.SelectAll().

Ответ 2

Удаление IsEnabled и установка TextBox как ReadOnly позволит вам выбирать текст, но останавливать ввод пользователя.

IsReadOnly="True" 

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

Чтобы обойти это (если вы хотите?), вы можете просто добавить стиль, чтобы облегчить текст и затемнить фон (чтобы он выглядел отключенным).

Я добавил следующий пример со стилем, который будет перемещать текстовое поле между отключенным и включенным.

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

Ответ 3

Одна нота, которую я только что обнаружил (очевидно, это старый вопрос, но это может помочь кому-то):

Если IsHitTestVisible=False, то выбор (и, следовательно, Копировать) также отключен.

Ответ 4

Немного измененный пример - чтобы соответствовать стилю 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".