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

时间:2015-07-27 07:33:02

标签: wpf xaml wpf-controls controltemplate

TextBlock元素可以很好地处理LineHeight,允许文本完全显示,而不会剪切。但是,我想将其更改为TextBox以便于编辑文本,这就是我的麻烦开始的地方。

TextBlock显示如下文字:

Tall letters display beyond the hight of the TextBlock

TextBox显示如下文字:

Tall letters are being clipped!

我试图摆弄ClipToBoundsClip属性,但它只在元素中剪辑,不会超出边界。

LineHeight属性需要设置为低以调节线之间的差距,因此不能选择更改。

我也尝试了Padding,但它只做了这个

Padding, but text is still clipped

如果这是唯一的解决方案,我会不按自己的方式听取按键并相应地更改文本,但这似乎是很多工作,我不认为这是一个很好的解决方案,所以这是我的简明问题:

如果可能TextBox TextBlockprivate 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>

它适用于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; }

中的此控件
foreach ($posts as $post) {
        $json[] = [
            'img_url' => "mysite.com/images/content/" . $post->imgUrl,
        ];
}

<小时/> 的更新 根据Cadogis的回答,样式设定器代码结果如下:

'gallery' => foreach ($post->gallery->galleryMedia as $mediaItem) { $mediaItem->imgUrl }

产生了非常理想的结果

TextBox with TextBlock clipping!

感谢你们两位帮助我!

2 个答案:

答案 0 :(得分:3)

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

<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

答案 1 :(得分:2)

我尝试了你的设置(用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>