2012-04-19 3 views
15

Я хотел бы использовать опцию TextTrimming на TextBox (Не TextBlock).TextBox TextTrimming

Компилятор сообщает мне, что параметры TextTrimming являются недействительной собственностью Textbox.

я мог сделать причудливый контроль, который является Textblock и как только он нажал буду стать Textbox и, наоборот, вернуться к будучи Textblock когда фокус теряются.

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

EDIT: то, что я хочу иметь в конце, это TextBox, который является обрезкой (полный контент будет отображаться в подсказке), но когда пользователь выбирает TextBox (введите «режим редактирования»), полный контент будет (без обрезки), поэтому пользователь сможет изменить полный текст. когда TextBox потерял фокус (вернитесь в режим просмотра), содержимое снова будет обрезано.

Благодаря

+0

Если вы используете mvvm, вы можете обрезать значение, которое будет храниться в ваших свойствах. при изменении свойства также обновляется значение в пользовательском интерфейсе. – Akanksha

+0

@DDzire: Я согласен, что могу это сделать, но я думаю, что это действительно поведение дисплея, и я не хочу, чтобы каждый раз, когда я хочу обрабатывать этот вид отображения, я бы не использовал какую-то логику отделки в моей модели просмотра. – Guillaume

ответ

31

Попробуйте стиль, как это (я добавил цвета фона, чтобы сделать изменения очевидны):

<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

Отлично !!! это то, что я хотел – Guillaume

+5

Иногда мне просто нравится WPF и StackOverflow :-) – Karsten

+0

Вы отключили MaxLines с этим правом? – atomaras

1

Я думаю ваты вы ищете это

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

Я надеюсь, что это помогает :)

Он будет вызывать функцию декоративной и передать какие-либо аргументы, если вы хотите. Вы также можете использовать split и передать разделители в качестве аргументов.

Вы можете найти больше Binding.Converter here

+0

Это не сработает в я хочу. В вашем случае это будет отображаться корректно, но у меня больше не будет режима редактирования (пользователь больше не будет иметь доступ к триммерной части). – Guillaume

+0

Ват именно ты хочешь добиться ден? – Akanksha

+0

см. Мое редактирование для получения дополнительной информации. – Guillaume

0

Вы можете создать шаблон управления для TextBox, отображающей обычного редактор при фокусировке, и TextBlock с подрезкой, когда это не так.

+0

То, что я собирался делать, но я хотел знать, существует ли что-то встроенное. Я приму ваш ответ, если никто не придет с более умным способом до конца дня. – Guillaume

0

Попробуйте это:

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


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

Обрезка текста - это действие, связанное с пользовательским интерфейсом. Вмешательство для просмотра модели для изменения чего-либо в пользовательском интерфейсе - это плохая практика. Я узнал это на своей собственной шкуре. Не делай этого. –

1

Dan Puzey has a great answer, но я хотел бы добавить еще, так что стиль TextBlockпоявился как a TextBox.

Вот стиль XAML я придумал:

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

Это то, что управление выглядит, когда она не имеет фокус клавиатуры:

TextBlock - No Keyboard Focus

Это то, что управление выглядит например, после усиления фокуса клавиатуры:

TextBox - With Keyboard Focus

0

enter image description here

enter image description here

Я хотел бы использовать другой шаблон управления: шаблон с подрезкой, когда текстовое поле не сфокусировано, в то время как текстовое поле сфокусировано я хотел бы использовать регулярный шаблон, чтобы выделение текста. Нужно заменить шаблон управления 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> 
Смежные вопросы