TextBox实现TextBlock样式,可拷贝、粘贴

TextBox可拷贝

<Style x:Key="SelectableTextBlockLikeStyle" TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="IsReadOnly" Value="True"/>
    <Setter Property="IsTabStop" Value="False"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Padding" Value="-2,0,0,0"/>
    <Style.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsMouseOver" Value="False" />
                <Condition Property="IsFocused" Value="False" />
            </MultiTrigger.Conditions>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <TextBlock Text="{TemplateBinding Text}" 
                     FontSize="{TemplateBinding FontSize}"
                     FontStyle="{TemplateBinding FontStyle}"
                     FontFamily="{TemplateBinding FontFamily}"
                     FontWeight="{TemplateBinding FontWeight}"
                     TextWrapping="{TemplateBinding TextWrapping}"
                     Foreground="{DynamicResource NormalText}"
                     Padding="0,0,0,0"
                     HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
                     VerticalAlignment="{TemplateBinding VerticalAlignment}"
                               />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </MultiTrigger>
    </Style.Triggers>
</Style> 

效果图:

textbox设置光标

/// <summary>
/// 设置光标位置
/// </summary>
/// <param name="textBox"></param>
/// <param name="index"></param>
private static void SetCursor(TextBox textBox, int index)
{
    if (index < 0)
    {
        return;
    }
    if (index > textBox.Text.Length)
    {
        index = textBox.Text.Length;
    }
    textBox.SelectionStart = index;
}

textbox只输入数字

  1. 禁用输入法
<TextBox InputMethod.IsInputMethodEnabled="False"  PreviewKeyDown="TextBox_PreviewKeyDown" PreviewTextInput="TextBox_PreviewTextInput"/>
  1. 正则判断
private void TextBox_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
{
    if (e.OriginalSource is TextBox txt)
    {
        e.Handled = !PageValidate.VerifyNonnegativeInteger(txt.Text + e.Text, string.Empty);
    }
    else
    {
        e.Handled = true;
    }
}
// 禁用空格
private void TextBox_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key == System.Windows.Input.Key.Space)
    {
        e.Handled = true;
    }
    System.Console.WriteLine(e.Key);
}

textblock绑定+备注

<TextBlock HorizontalAlignment="Left" Margin="0,0,0,0" Foreground="White" >
    <Run Text="{Binding PropertyName}" />
    <Run Text="个" />
    <Run Text="(" />
    <Run Text="{Binding PropertyName2}" />
    <Run Text="备注)" />
</TextBlock>

textblock省略号

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="auto"/>
    </Grid.ColumnDefinitions>
    <TextBlock Text="{Binding PropertyName1}" TextTrimming="CharacterEllipsis">
        <TextBlock.ToolTip>
            <ToolTip Content="{Binding PropertyName1}"/>
        </TextBlock.ToolTip>
    </TextBlock>
    <TextBlock Grid.Column="1" Text="{Binding PropertyName2}"/>
</Grid>

textblock换行

TextWrapping="Wrap"

textblock省略号 + tooltip

文本过长被截断后,用ToolTip显示完整信息

<cvt:TrimmedVisibilityConverter x:Key="trimmedVisibilityConverter"/>

<TextBlock Text="{Binding PropertyName1}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" >
    <TextBlock.ToolTip>
        <ToolTip Visibility="{Binding RelativeSource={RelativeSource Self}, 
            Path=PlacementTarget, Converter={StaticResource trimmedVisibilityConverter}}">
            <ToolTip.Content>
                <TextBlock Text="{Binding PropertyName1}" TextWrapping="Wrap"/>
            </ToolTip.Content>
        </ToolTip>
    </TextBlock.ToolTip>
</TextBlock>
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

public class TrimmedVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
        {
            return Visibility.Collapsed;
        }
        if (value is FrameworkElement textBlock)
        {
            textBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
            if (textBlock.ActualWidth < textBlock.DesiredSize.Width)
            {
                return Visibility.Visible;
            }
        }
        return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

textblock与label

TextBlock直接继承于FrameworkElement,而Label继承于ContentControl。
Label控件包含着TextBlock。
TextBlock属于比较底层的控件,因此它的性能要比Label好一些。如果需求只是纯文本的显示,并且不提供Access key的支持,那么TextBlock是个不错的选择。

posted @ 2019-12-05 13:57  wesson2019  阅读(869)  评论(0)    收藏  举报