2012-04-19 66 views
15

我想在TextBox(不是TextBlock)上應用TextTrimming選項。TextBox TextTrimming

編譯器告訴我,TextTrimming選項不是Textbox的有效屬性。

我可以做一個奇特的控件,它是一個Textblock,一旦它被點擊就會變成Textbox,相反,一旦焦點丟失,就會回到Textblock

在這樣做之前,我想知道一個內置函數是否已經存在(或者是否有更聰明的方法)來允許您這樣做?

編輯:我想有到底是一個TextBox這是修剪(完整內容將在工具提示中顯示),但是當用戶選擇TextBox(「編輯模式」進入)的全部內容將被顯示(沒有修剪),因此用戶將能夠修改全文。當TextBox失去焦點(回到「查看模式」),內容將再次修剪。

感謝

+0

如果您使用mvvm,您可以修剪存儲在屬性中的數值dat。在屬性更改時,UI上的值也會更新。 – Akanksha 2012-04-19 11:40:16

+0

@DDzire:我同意我可以這樣做,但我認爲這實際上是一種顯示行爲,我不想在每次處理這種顯示時在我的viewmodel中放入一些修剪邏輯 – Guillaume 2012-04-19 11:45:16

回答

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 2012-04-19 12:51:56

+5

有時我只是喜歡WPF和StackOverflow :-) – Karsten 2012-10-26 08:57:56

+0

你用這個權限禁用MaxLines? – atomaras 2014-08-25 21:24:06

1

我想笏你正在尋找的是這樣的

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

我希望它能幫助:)

它將調用修正功能並傳遞任何參數,如果你想。 您也可以使用split並將分隔符作爲參數傳遞。

你可以找到更多關於Binding.Converter here

+0

它不會在我想要的方式。在你的情況下,它會正確顯示,但我不會有一個適當的編輯模式了(用戶將不再有修剪部分)。 – Guillaume 2012-04-19 12:02:33

+0

笏真的你想實現巢穴? – Akanksha 2012-04-19 12:06:50

+0

看到我的編輯更多inforamtion。 – Guillaume 2012-04-19 12:15:47

0

您可以爲TextBox集中時顯示通常的編輯器,並用時,它不是修剪TextBlock創建控件模板。

+0

這是我要做的,但我想知道是否內置內置功能已經存在。如果沒有人在一天結束前更聰明地採取行動,我會接受你的回答。 – Guillaume 2012-04-19 12:45:49

0

試試這個:

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


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

文本修剪 - 這是一個與UI相關的操作。介入以查看模型來改變用戶界面中的某些內容是一種不好的做法。我在自己的皮膚上學會了它。不要這樣做。 – 2016-08-15 08:24:02

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>