标签不显示“_”字符

时间:2012-03-13 13:12:20

标签: .net wpf label

我在WPF中的Label.Content并未显示第一次出现的" _"字符。为什么?

<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="148" Width="211">
    <Grid>
        <Label Content="L_abel" Height="28" HorizontalAlignment="Left" Margin="37,31,0,0" Name="label1" VerticalAlignment="Top" />
    </Grid>
</Window>

enter image description here

设置Label.Content ="L__abel"时:

enter image description here

项目中没有其他代码。

7 个答案:

答案 0 :(得分:41)

WPF中使用

_来表示访问密钥,即您可以使用 Alt 按下以获得焦点或调用UI元素的密钥。这类似于Windows API和Windows窗体中&的使用方式。由于标签旨在用作另一个控件的标签(例如,用于描述文本框),因此非常期待这一点。当您按 Alt 时,您会看到示例中的a加下划线。

来自documentation

  

要设置访问密钥,请在应该是访问密钥的字符前添加下划线。如果您的内容有多个下划线字符,则只将第一个字符转换为访问密钥;其他下划线显示为普通文本。如果要转换为访问键的下划线不是第一个下划线,则对于要转换的下划线之前的任何下划线,请使用两个连续的下划线。例如,以下代码包含访问密钥并显示为_HelloWorld:

<Label>__Hello_World</Label> 
     

由于H之前的下划线是双精度型,因此W键将作为访问键注册。

我想如果您既不需要也不想要Label提供的功能,您可以使用TextBlock

答案 1 :(得分:9)

乔伊是对的!使用

<TextBlock>L_abel</TextBlock>

将显示所有下划线!

答案 2 :(得分:4)

因为_字母用于快捷方式(是加速器)

答案 3 :(得分:4)

在WPF中有一个名为 RecognizesAccessKey 的属性,尝试将其更改为false。如果您使用RadioButton,请注意后面还有标签,并且在RadioButton模板中禁用访问密钥识别,您必须在模板RecognizesAccessKey="False"上设置ContentPresenter。然后禁用它,或者用我现在不记得的其他东西替换标签。

答案 4 :(得分:3)

解决问题的最简单方法是:

更改

<Label Content="L_abel" Height="28" HorizontalAlignment="Left" Margin="37,31,0,0" Name="label1" VerticalAlignment="Top" />

<Label Height="28" HorizontalAlignment="Left" Margin="37,31,0,0" Name="label1" VerticalAlignment="Top">
<TextBlock Text="L_abel"/>
</Label>

答案 5 :(得分:0)

使用TextBlock解决此问题带有一些缺点,例如无法将内容垂直居中(将其放置在网格内,并且在许多情况下可能不需要附加的控件)。就我而言,我使用以下代码创建了一个行为像Label的TextBox:

var fauxLabel = new TextBox();
fauxLabel.Cursor = Cursors.Arrow; // Avoid the IBeam mouse cursor when hovering
fauxLabel.Background = Brushes.Transparent;
fauxLabel.BorderThickness = new Thickness(0.0, 0.0, 0.0, 0.0);
fauxLabel.Focusable = false;

答案 6 :(得分:0)

在几个地方,绑定到Label控件中的文本必须显示'_'字符。所以我写了一个转换器:

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace Converters
{
    public class TextToLabelConverter : DependencyObject, IValueConverter
    {
        /// <inheritdoc />
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return (value is string strValue)
                ? strValue.Replace("_", "__")
                : Binding.DoNothing;
        }

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

因此在XAML中使用它:

...
    xmlns:converters="clr-namespace:Converters"
...

<Window.Resources>
    <converters:TextToLabelConverter x:Key="TextToLabelConverter" />
</Window.Resources>

<Grid>
    <Label Content="{Binding SourceText, Converter={StaticResource TextToLabelConverter}}" />
</Grid>