Access Key会影响应用TextBox的内部样式

时间:2014-02-12 16:10:22

标签: wpf xaml

假设以下xaml:

<Grid>
    <Grid.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Margin" Value="20" />
        </Style>
    </Grid.Resources>

    <Button Content="Press Me" HorizontalAlignment="Left" VerticalAlignment="Top" />

</Grid>

结果如预期的那样:

但是当我将“_”符号添加到按钮的标题(Content =“_ Press Me”)时,它会给我:

为什么?

---------------- 问题更新2014年3月5日 ----------------

请参阅我对Rohit Vats回答的评论。

2 个答案:

答案 0 :(得分:1)

如果资源是在没有键且只有TargetType的情况下声明的,那么该样式会自动应用于该类型的所有子控件。因此,在您的情况下 属于Grid的可视子集合的所有TextBlocks将自动继承此样式


现在,回答你的问题

  

为什么将内容设置为_PressMe会使您的按钮展开   保证金为20而不是内容设置为PressMe

我希望您了解助记符。我将简要解释,如果文本前面带有下划线符号,则文本的第一个字符会自动变为用于访问按钮的助记符(或者您可以说访问键),即 Alt +在你的情况下, P 将作为调用按钮点击命令的访问键。

现在说 Button的默认模板是这样的:

<ControlTemplate>
   <Border>
      <ContentPresenter RecognizesAccessKey="True"/>
   </Border>
</ControlTemplate>

正如您所见,ContentPresenter负责托管您按钮的实际内容。 ContentPresenter在内部托管AccessText控件内的内容,该控件在其模板中包含TextBlock

因此,如果您的按钮TextBlock没有助记符,则永远不会呈现(不确定它内部如何决定),可能是基于案例助记符切换dataTemplate存在或不存在模板化父对象,这是您案例中的按钮)。因此,未应用保证金,您会看到没有任何保证金设置的按钮。

但是,如果按钮存在助记符,则TextBlock会被渲染。由于它是Grid的可视子,因此它选择在Re​​source部分下声明的默认样式。因此,您会看到一个带有边距20的扩展按钮。

答案 1 :(得分:-1)

'_'后面的字符成为访问键。例如,如果您想为“打印”按钮提供喊叫切换,您只需将其键入为打印,然后P将成为按钮打印的快捷方式。当您按下键P时,将执行单击打印按钮事件。如果您不想要这种行为,并且您希望在UI上显示“”,则放置2''(' _')。(它将表现为转义字符我们通常使用的字符串'\')

按下alt键将突出显示快捷键(如果UI上的控件

相关问题