假设以下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回答的评论。
答案 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的可视子,因此它选择在Resource部分下声明的默认样式。因此,您会看到一个带有边距20的扩展按钮。
答案 1 :(得分:-1)
'_'后面的字符成为访问键。例如,如果您想为“打印”按钮提供喊叫切换,您只需将其键入为打印,然后P将成为按钮打印的快捷方式。当您按下键P时,将执行单击打印按钮事件。如果您不想要这种行为,并且您希望在UI上显示“”,则放置2''(' _')。(它将表现为转义字符我们通常使用的字符串'\')
按下alt键将突出显示快捷键(如果UI上的控件
)