与 TextBlock 具有相同剪裁的 TextBox(TextBox 模板)

TextBox with the same clipping as TextBlock (TextBox Template)

TextBlock 元素很好地处理了 LineHeight,允许文本完整显示,没有剪裁。但是,我想将其更改为 TextBox 以便于编辑文本,这就是我的麻烦开始的地方。

TextBlock 显示如下文字:

TextBox 显示如下文字:

我已经尝试 fiddle 使用 ClipToBoundsClip 属性,但它只会在元素内剪辑,不会扩展到边界之外。

LineHeight 属性 需要设置低以调节线条之间的间隙,因此不能更改。

我也试过Padding,但它只能做到这一点

如果这是唯一的解决方案,我会不厌其烦地听按键并相应地更改文本,但这似乎需要很多工作,而且我认为这不是一个好的解决方案,所以这是我的浓缩问题:

如何使 TextBox 不以与 TextBlock 相同的方式剪辑文本(如果可能的话)?


更新这是样式代码(无论如何我目前都有)及其应用位置。

private static Style GetFontTextBlock()
{
    var style = new Style();
    style.Setters.Add(new Setter(TextBlock.LineStackingStrategyProperty, LineStackingStrategy.BlockLineHeight));
    style.Setters.Add(new Setter(TextBlock.IsHyphenationEnabledProperty, true));
    style.Setters.Add(new Setter(TextBlock.TextWrappingProperty, TextWrapping.Wrap));
    style.Setters.Add(new Setter(Control.BorderBrushProperty, null));
    return style;
}

public static Style GetHeadline()
{
    // ApplyFont sets the Control.FontFamilyProperty to Geogrotesque Condensed Regular.
    // It's a purchased font so I can't supply it, unfortunately
    var style = ApplyFont(new Style { BasedOn = GetFontTextBlock() });
    style.Setters.Add(new Setter(TextBlock.FontSizeProperty, 140));
    style.Setters.Add(new Setter(TextBlock.LineHeightProperty, 112));
    return style;
}

它在 UserControl

内应用于此控件
<Grid>
    ...
    <StackPanel>
        <TextBox Background="Cornsilk" Name="Headline" AcceptsReturn="True" />
    ...
    </StackPanel>
    ...
</Grid>


更新 根据 Cadogis 的回答,样式 setter 代码结果如下:

public static Style GetHeadline(Enums.Enums.SheetSizes size, object triggerTarget)
    [...]
    style.Setters.Add(new Setter(TextBox.TemplateProperty, XamlReader.Parse(
        // Breaks and indentation for readability
        @"<ControlTemplate TargetType='TextBox'
            xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>
            <DockPanel>
                <Decorator Name='PART_ContentHost' />
            </DockPanel>
        </ControlTemplate>")));
    return style;
}

这会产生非常理想的结果

感谢两位对我的帮助!

我尝试了您的设置(在 xaml 中以样式重写)并使用 TextBlock,我看到了与您相同的显示。但是对于 TextBox,字母是完全可见的,没有任何内容被剪裁。

 <UserControl x:Class="WpfApplication2.UserControl2"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
  <UserControl.Resources>
    <Style x:Key="FontTextBoxStyle" TargetType="{x:Type TextBox}">
      <Setter Property="TextBlock.LineStackingStrategy" Value="BlockLineHeight"></Setter>
      <Setter Property="TextBlock.IsHyphenationEnabled" Value="True">  </Setter>
      <Setter Property="TextBlock.TextWrapping" Value="Wrap"></Setter>
      <Setter Property="Control.BorderBrush" Value="{x:Null}"></Setter>
    </Style>
    <Style x:Key="HeadlineFontTextBoxStyle" TargetType="{x:Type TextBox}" BasedOn="{StaticResource FontTextBoxStyle}">
      <Setter Property="TextBlock.LineHeight" Value="122"></Setter>
      <Setter Property="FontSize" Value="140"></Setter>
    </Style>
  </UserControl.Resources>
  <StackPanel>
    <TextBox Text="Testtest" Style="{StaticResource HeadlineFontTextBoxStyle}" />
  </StackPanel> 
 </UserControl>

我可能在这里遗漏了一些东西,但是在调用您的文本框时,您可以设置高度和宽度的最小值和最大值,然后将它们设置为自动,例如

<TextBox Text="Test&#xA;test" Style="{StaticResource HeadlineFontTextBoxStyle}" 
AcceptsReturn="True" Height="Auto" MinHeight="24" MaxHeight="120" />

我应该指出,在堆栈面板中使用它会限制默认高度,使用网格会给你最好的结果,因为它会动态扩展。

显然您不希望控件无限扩展,因此如果它变得太大,max 属性将控制它,但 "Auto" 应该允许它适当地调整大小。对不起,如果我完全错过了重点。


模板创意

不确定这是否正是您想要的,但它是一个修改后的文本框模板,可以在边界外呈现(它使用装饰器而不是滚动查看器)- 我想我应该尝试提供一个选项可能有用。

<UserControl x:Class="UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
    <Style x:Key="FontTextBoxStyle" TargetType="{x:Type TextBox}">
        <Setter Property="TextBlock.LineStackingStrategy" Value="BlockLineHeight"></Setter>
        <Setter Property="TextBlock.IsHyphenationEnabled" Value="True"></Setter>
        <Setter Property="TextBlock.TextWrapping" Value="Wrap"></Setter>
        <Setter Property="Control.BorderBrush" Value="{x:Null}"></Setter>
    </Style>
    <Style x:Key="HeadlineFontTextBoxStyle" TargetType="{x:Type TextBox}" >
    <Setter Property="TextBlock.LineHeight" Value="100"></Setter>
    <Setter Property="TextBlock.LineStackingStrategy" Value="BlockLineHeight"/>
    <Setter Property="FontSize" Value="140"></Setter>
    <Setter Property="AcceptsReturn" Value="True" />
    <Setter Property="Height" Value="Auto"/>
    <Setter Property="VerticalContentAlignment" Value="Top"/>
        <Setter Property="Template">
            <Setter.Value>
            <ControlTemplate TargetType="TextBox">
                    <DockPanel>                           
                        <Decorator Name="PART_ContentHost" />
                    </DockPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>
<Grid>
    <TextBox Text="Test&#xA;test" Style="{StaticResource HeadlineFontTextBoxStyle}" TextChanged="TextBox_TextChanged" />
</Grid>

作为参考,您可能需要从 MSDN 查看此内容: https://msdn.microsoft.com/en-us/library/ms752068%28v=vs.85%29.aspx