Почему стиль меняется, когда я добавляю ускоритель к моей кнопке? - PullRequest
1 голос
/ 06 октября 2010

Когда содержимое моей кнопки отображается как обычная строка, например, <Button Content="Ok" />, кнопка работает как обычно.Но если я изменю содержимое, чтобы оно имело ускоритель клавиатуры, например, <Button Content="_Ok" />, стиль кнопки изменится на разные поля и размеры.

У меня есть стиль TextBlock, у которого нет клавиши, поэтому он применяется ко всемTextBlocks, мой вопрос, почему он применяется, когда у контента есть ускоритель, а не когда его нет?

Редактировать: Для дополнительной информации: Стиль по умолчанию находится внутри ресурсовStackPanel, то есть кнопка внутри.Я предполагаю, что вопрос действительно, , почему стиль TextBlock по умолчанию не применяется, когда кнопка имеет ускоритель?

Ответы [ 2 ]

1 голос
/ 06 октября 2010

WPF добавляет TextBlock к каждой кнопке (и меню) с помощью ускорителя.
Вы можете увидеть этот эффект, запустив следующий XAML (не забудьте при необходимости подключить Команду).

Ключом к решению проблемы, учитывая сферу вашего вопроса, является установка TextAlignment в значение Center для TextBlock. Если вы установите ширину для стиля TextBlock (моя строка закомментирована ниже), текст начнет смещаться. Добавление HorizontalAlignment = Center также помогает центрировать текст в TextBlock / Button, но это также влияет на другие элементы управления TextBlock.

<Window x:Class="ButtonAccelerator.Views.MainView"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="Main Window" Height="400" Width="800">
  <Window.Resources>
    <Style TargetType="TextBlock">
        <!--<Setter Property="Width" Value="70"/>-->
        <Setter Property="Height" Value="23"/>
        <Setter Property="Background" Value="Pink"/>
        <Setter Property="TextAlignment" Value="Center"/>
    </Style>
    <Style TargetType="Button">
        <Setter Property="Width" Value="70"/>
        <Setter Property="Height" Value="23"/>
    </Style>
  </Window.Resources>
  <DockPanel>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <StackPanel 
            Grid.Row="1" Grid.Column="1"
            HorizontalAlignment="Right"
            Orientation="Horizontal">
            <TextBlock Text="OK" />
            <Button 
                Content="OK"/>
            <Button 
                Content="_OK"/>
        </StackPanel>
    </Grid>
  </DockPanel>
</Window>
0 голосов
/ 06 октября 2010

Вы должны проверить это с помощью Snoop , но <Button Content="Ok" /> создает TextBlock для обработки текста внутри кнопки.Так как TextBlock не поддерживает клавиши ускорения, я бы поспорил, что <Button Content="_Ok" /> заставляет его генерировать Label, поскольку Label позаботится о клавише ускорения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...