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只输入数字
- 禁用输入法
<TextBox InputMethod.IsInputMethodEnabled="False" PreviewKeyDown="TextBox_PreviewKeyDown" PreviewTextInput="TextBox_PreviewTextInput"/>
- 正则判断
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是个不错的选择。

浙公网安备 33010602011771号