2009-07-27 20 views
13

Tengo este TextBox. Este cuadro de texto se encuentra en DataTemplate:wpf: ¿Seleccionar el texto en TextBox con IsReadOnly = true?

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

y quiero Permitir al usuario seleccionar todo el texto en su interior (opcionalmente haciendo clic en el cuadro de texto). Y no quiero usar ningún código detrás.

¿Cómo hacer eso? Gracias por adelantado.

+0

He usado 'SelectAll()' y luego le permite hacer clic derecho y copiar el contenido sin embargo. – EricG

Respuesta

18

El uso de la propiedad IsReadOnly en lugar de IsEnabled permite al usuario seleccionar texto. Además, si no se debe editar, un enlace OneWay debería ser suficiente.

La idea de XAML no es reemplazar por completo el código subyacente. Lo más importante es que intenta tener solo código específico de UI en el código subyacente, no en lógica comercial. Dicho esto, seleccionar todo el texto es específico de la interfaz de usuario y no duele en el código subyacente. Use myTextBox.SelectAll() para eso.

+0

Bueno, el problema es que este se encuentra en un DataTemplate. Y lo que sé Los eventos no se pueden usar en DataTemplates. –

+0

Qué más, estoy tratando de usar el MVVM. ¿Está bien tener un código específico de UI en el código? Por ejemplo, mis botones no tienen controladores de eventos Onclick, pero están vinculados a ICommand directamente en MVVM. –

+0

Si solo es específico de UI, está bien colocarlo en el código. Con MVVM, rara vez es necesario, pero eso no significa que nunca lo necesite. Además, hay medios para obtener controles generados a partir de una plantilla de datos. Por ejemplo, si tiene un ItemsControl (Listbox, etc.), puede usar listBox.ItemContainerGenerator.ContainerFromItem (listBox.SelectedItem); – Botz3000

6

Al eliminar IsEnabled y configurar TextBox como ReadOnly, se puede seleccionar el texto pero detener la entrada del usuario.

IsReadOnly="True" 

El único problema con este enfoque es que, aunque usted no será capaz de escribir en el cuadro de texto que sigue se verá 'Activado'.

Para redondear eso (si lo desea) puede simplemente agregar un estilo para aclarar el texto y oscurecer el fondo (para que parezca deshabilitado).

He agregado el siguiente ejemplo con un estilo que moverá el cuadro de texto entre una apariencia deshabilitada y habilitada.

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

Una nota que acabo de descubrir (obviamente esto es una cuestión de edad, pero esto podría ayudar a alguien):

Si IsHitTestVisible=False luego seleccionando (y por lo tanto Copia) también se desactiva.

0

ejemplo ligeramente modificado - para que coincida con el estilo de Windows Forms (no inventar su propio estilo nuevo)

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> 

Y, por supuesto, su cuadro de texto debe tener configurado IsReadOnly = "true" atributo.

Cuestiones relacionadas