2012-04-19 24 views
15

quisiera aplicar una opción TextTrimming en un TextBox (No es un TextBlock).cuadro de texto TextTrimming

El compilador me dice que las opciones TextTrimming no son una propiedad válida del Textbox.

que podía hacer un control de fantasía que es un Textblock y una vez que se hace clic se convertirá en un Textbox y por el contrario volver a ser un Textblock una vez que se pierde el foco.

Antes de ir de esta manera, me gustaría saber si ya existe una función incorporada (¿o existe una forma más inteligente) de permitirle hacer eso?

EDIT: Lo que quiero tener al final es un TextBox que es recortar (el contenido completo se mostrará en una información sobre herramientas) pero cuando el usuario seleccione TextBox (entrar en "modo de edición"), el contenido completo ser pantalla (sin recorte) por lo tanto, el usuario podrá modificar el texto completo. cuando el TextBox perdió el foco (vuelva al "modo de visualización"), el contenido se recortará nuevamente.

Gracias

+0

Si está utilizando mvvm, puede recortar el valor que se almacena en sus propiedades. en cambio de propiedad, el valor en UI también se actualiza. – Akanksha

+0

@DDzire: Estoy de acuerdo en que puedo hacerlo, pero creo que es realmente un comportamiento de visualización y realmente no quiero poner un poco de lógica de ajuste en mi modelo de vista cada vez que quiero manejar este tipo de pantalla – Guillaume

Respuesta

31

Pruebe con un estilo como este (He añadido los colores de fondo para hacer el cambio obvio):

<Style TargetType="TextBox"> 
     <Setter Property="Background" Value="Yellow" /> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding IsKeyboardFocused, RelativeSource={RelativeSource Self}}" Value="false"> 
      <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="TextBox"> 
       <TextBlock Text="{TemplateBinding Text}" TextTrimming="CharacterEllipsis" Background="Red" /> 
       </ControlTemplate> 
      </Setter.Value> 
      </Setter> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
+0

¡¡¡Genial !!! eso es excatly lo que quería – Guillaume

+5

A veces me encantan WPF y StackOverflow :-) – Karsten

+0

Desactiva MaxLines con este derecho? – atomaras

1

creo wat que busca es este

<TextBox Text="{Binding Path=String, Converter={StaticResource StringConverter}, ConverterParameter=Trim:Argument:AnotherArgument}" /> 

espero que ayude :)

Se llamará a la función de cortar y pasar ningún argumento, si lo desea. También puede usar dividir y pasar los delimitadores como argumentos.

Puede encontrar más información sobre Binding.Converter here

+0

No funcionará en el camino que quiero En su caso, se mostrará correctamente, pero ya no tendré un modo de edición adecuado (el usuario ya no tendrá acceso a la parte de recorte). – Guillaume

+0

wat ¿exactamente quieres lograr la guarida? – Akanksha

+0

ver mi edición para más inforamtion. – Guillaume

0

Puede crear una plantilla de control para su TextBox que deben mostrarse el editor habitual cuando se enfoca, y una TextBlock con el recorte cuando no lo es.

+0

Eso es lo que iba a hacer, pero quería saber si ya existe algo incorporado. Aceptaré tu respuesta si nadie viene con una forma más inteligente antes de que termine el día. – Guillaume

0

Prueba esto:

<TextBox Text={Binding Text}> </text> 


private string _text; 
public string Text 
{ 
    get { return _text;} 
    set 
    { 
     _text=value.Trim(); 
     NotifyPropertyChanged("Text"); 
    } 
} 
+0

Recorte de texto: es una acción relacionada con la IU. La intervención para ver el modelo para cambiar algo en la IU es una mala práctica. Lo aprendí en mi propia piel. No lo hagas –

1

Dan Puzey has a great answer, pero quería añadir más para que el estilo del TextBlockapareció como a TextBox.

Aquí es el estilo XAML que se me ocurrió:

<Style TargetType="TextBox"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding IsKeyboardFocused, RelativeSource={RelativeSource Self}}" Value="False"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="TextBox"> 
         <Border BorderThickness="1" CornerRadius="1"> 
          <Border.BorderBrush> 
           <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
            <GradientStop Color="#FFABADB3" Offset="0"/> 
            <GradientStop Color="#FFABADB3" Offset="0.044"/> 
            <GradientStop Color="#FFE2E3EA" Offset="0.060"/> 
            <GradientStop Color="#FFE3E9EF" Offset="1"/> 
           </LinearGradientBrush> 
          </Border.BorderBrush> 
          <TextBlock Padding="4,2,0,0" Text="{TemplateBinding Text}" TextTrimming="CharacterEllipsis"/> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

Esto es lo que el control se parece a cuando no tiene el foco del teclado:

TextBlock - No Keyboard Focus

Esto es lo que las miradas de control como después de ganar el foco del teclado:

TextBox - With Keyboard Focus

0

enter image description here

enter image description here

yo usaría diferente plantilla de control: el recorte de plantilla con al cuadro de texto no está enfocada, mientras que la caja de texto se centra me gustaría utilizar la plantilla regular para permitir la selección de texto. Necesita reemplazar la plantilla de control TextBox.

<ControlTemplate TargetType="{x:Type TextBox}" 
       x:Key="ControlTemplateTextBoxNormal"> 
    <Border Background="{TemplateBinding Background}" 
      BorderThickness="{TemplateBinding BorderThickness}" 
      BorderBrush="{TemplateBinding BorderBrush}"> 
     <Grid> 
      <Border x:Name="ErrorElement" 
        Visibility="Collapsed" 
        BorderThickness="1.25" 
        BorderBrush="{StaticResource BrushError}"> 
       <Grid> 
        <Polygon x:Name="toolTipCorner" 
          Panel.ZIndex="2" 
          Margin="-1" 
          Points="9,9 9,0 0,0" 
          Fill="{StaticResource BrushError}" 
          HorizontalAlignment="Right" 
          VerticalAlignment="Top"> 
         <Polygon.ToolTip> 
          <ToolTip Style="{StaticResource ToolTipStyleError}" 
            Content="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={RelativeSource TemplatedParent}}" /> 
         </Polygon.ToolTip> 
        </Polygon> 
       </Grid> 
      </Border> 
      <ScrollViewer x:Name="PART_ContentHost" 
          Padding="{TemplateBinding Padding}" 
          BorderThickness="0" 
          IsTabStop="False" 
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
          TextElement.Foreground="{TemplateBinding Foreground}" /> 
      <TextBlock Text="{Binding Path=(behaviors:TextBoxBehaviors.WatermarkText), RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type TextBox}}}" 
         IsHitTestVisible="False" 
         Visibility="Collapsed" 
         HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
         VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
         Margin="{TemplateBinding Padding}" 
         Foreground="Gray" 
         x:Name="watermark" /> 
     </Grid> 
    </Border> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsFocused" 
       Value="False"> 
      <Setter Property="Visibility" 
        TargetName="watermark" 
        Value="Visible" /> 
     </Trigger> 
     <Trigger Property="Validation.HasError" 
       Value="True"> 
      <Setter Property="Visibility" 
        TargetName="ErrorElement" 
        Value="Visible" /> 
     </Trigger> 
     <!--<Trigger Property="behaviors:TextBoxBehaviors.WatermarkText" 
          Value="True"> 
         <Setter Property="Visibility" 
           TargetName="ErrorElement" 
           Value="Visible" /> 
        </Trigger>--> 

    </ControlTemplate.Triggers> 
</ControlTemplate> 
<Style TargetType="{x:Type TextBox}" 
     BasedOn="{StaticResource {x:Type TextBox}}" 
     x:Key="TextBoxStyleTrimming"> 
    <Setter Property="BorderThickness" 
      Value="1" /> 
    <Setter Property="Validation.ErrorTemplate" 
      Value="{x:Null}" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TextBox}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderThickness="{TemplateBinding BorderThickness}" 
         BorderBrush="{TemplateBinding BorderBrush}"> 
        <Grid> 
         <Border x:Name="ErrorElement" 
           Visibility="Collapsed" 
           BorderThickness="1.25" 
           BorderBrush="{StaticResource BrushError}"> 
          <Grid> 
           <Polygon x:Name="toolTipCorner" 
             Panel.ZIndex="2" 
             Margin="-1" 
             Points="9,9 9,0 0,0" 
             Fill="{StaticResource BrushError}" 
             HorizontalAlignment="Right" 
             VerticalAlignment="Top"> 
            <Polygon.ToolTip> 
             <ToolTip Style="{StaticResource ToolTipStyleError}" 
               Content="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={RelativeSource TemplatedParent}}" /> 
            </Polygon.ToolTip> 
           </Polygon> 
          </Grid> 
         </Border> 
         <TextBlock Padding="{TemplateBinding Padding}" 
            Text="{TemplateBinding Text}" 
            TextTrimming="CharacterEllipsis" 
            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
            VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
            TextElement.Foreground="{TemplateBinding Foreground}" /> 
         <TextBlock Text="{Binding Path=(behaviors:TextBoxBehaviors.WatermarkText), RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type TextBox}}}" 
            IsHitTestVisible="False" 
            Visibility="Collapsed" 
            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
            VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
            Margin="{TemplateBinding Padding}" 
            Foreground="Gray" 
            x:Name="watermark" /> 
        </Grid> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsFocused" 
          Value="False"> 
         <Setter Property="Visibility" 
           TargetName="watermark" 
           Value="Visible" /> 
        </Trigger> 
        <Trigger Property="Validation.HasError" 
          Value="True"> 
         <Setter Property="Visibility" 
           TargetName="ErrorElement" 
           Value="Visible" /> 
        </Trigger> 

       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsKeyboardFocused" 
       Value="True"> 
      <Setter Property="Template" 
        Value="{StaticResource ControlTemplateTextBoxNormal}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
Cuestiones relacionadas