wpf:使用IsReadOnly = true选择TextBox中的文本?

时间:2009-07-27 06:49:41

标签: wpf select textbox

我有这个TextBox。此TextBox位于 DataTemplate

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

我希望允许用户选择其中的整个文本(可选择通过单击文本框)。而且我不想使用任何 代码背后。

怎么做?提前谢谢。

4 个答案:

答案 0 :(得分:19)

使用IsReadOnly属性而不是IsEnabled允许用户选择文本。此外,如果不应该编辑它,OneWay绑定就足够了。

XAML的想法不是完全取代代码隐藏。最重要的是,您尝试在代码隐藏中仅使用特定于UI的代码,而不是业务逻辑。话虽这么说,选择所有文本是特定于UI的,并且在代码隐藏中不会受到伤害。使用myTextBox.SelectAll()。

答案 1 :(得分:6)

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

答案 2 :(得分:5)

我刚刚发现的一个注释(显然这是一个老问题,但这可能对某人有帮助):

如果IsHitTestVisible=False,则选择(并因此复制)也会被禁用。

答案 3 :(得分:0)

略微修改的示例 - 匹配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 =&#34; True&#34;属性集。