Стили кнопок панели инструментов игнорируются?

У меня есть кнопки на панели инструментов в WPF.

Когда я выполняю XAML:

<ToolBar.Resources>
   <Style TargetType="{x:Type Button}">
      <Setter Property="Width" Value="21"></Setter>
      <Setter Property="Height" Value="21"></Setter>
   </Style>
</ToolBar.Resources>

Ни одна из кнопок на панели инструментов не устанавливает свой размер соответствующим образом.

Мне нужно перейти к каждой кнопке и вручную установить их ширину и высоту на желаемые значения.

Есть идеи, почему стиль на панели инструментов не работает?


person TheWommies    schedule 09.03.2010    source источник


Ответы (3)


Это происходит потому, что ToolBar применяет стиль, обозначенный ToolBar.ButtonStyleKey к кнопкам, вместо того, чтобы оставить для них стиль по умолчанию. (Вот почему кнопки на панелях инструментов плоские, хотя стиль по умолчанию поднят.) Справочник.

Вам нужно «захватить» этот стиль вместо стиля по умолчанию:

<ToolBar.Resources>
  <Style x:Key="{x:Static ToolBar.ButtonStyleKey}" TargetType="Button">
    <Setter Property="Width" Value="100" />
  </Style>
</ToolBar.Resources>

Обратите внимание на x: Key в объявлении стиля.

person itowlson    schedule 09.03.2010

Если вы добавляете жестко запрограммированные кнопки на панель инструментов, вы можете установить для ToolBar.ItemContainerStyle собственный стиль, чтобы получить желаемый эффект.

<ToolBar.ItemContainerStyle>
    <Style
        TargetType="Button">
        <Setter
            Property="Width"
            Value="21" />
        <Setter
            Property="Height"
            Value="21" />
    </Style>
</ToolBar.ItemContainerStyle>

Если вы используете ToolBar.ItemsSource, вы можете вместо этого использовать ToolBar.ItemTemplate для определения шаблона для данных панели инструментов.

<ToolBar.ItemTemplate>
    <DataTemplate>
        <Button
            Width="21"
            Height="21"
            Content="{Binding}" />
    </DataTemplate>
</ToolBar.ItemTemplate>

Обратите внимание, что в некоторых случаях оба из них могут использоваться одновременно для дополнительной гибкости.

Это относится не только к панели инструментов, но и ко всем производным от ItemsControl.

Удачи,

person Kep Amun    schedule 09.03.2010

Как отмечено в другом ответе, панель инструментов автоматически применяет свои собственные стили ко многим / наиболее типичным элементам управления, добавленным к ней.

В качестве альтернативы захвату его ключей стиля или применению ваших собственных стилей к элементам управления вручную вы можете вместо этого переопределить его метод, который в первую очередь устанавливает его внутренние стили. Простой пример:

public class LessIsMoreToolbar : ToolBar
{
    protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        // Nada
    }
}

а затем используйте <local:LessIsMoreToolbar> в своем XAML вместо <Toolbar>.

Обратите внимание, что здесь PrepareContainerForItemOverride() специально НЕ вызывает base.PrepareContainerForItemOverride () `. Это то, что исключает установку стилей. Вы можете самостоятельно просмотреть базовую версию этого метода, чтобы убедиться, что это не устраняет ничего, что вам нужно.

Одно предостережение заключается в том, что PrepareContainerForItemOverride определяется ItemsControl, который похож на прадеда Toolbar. Его версия этого метода запускает некоторые другие Prepare... случаи, которые, вы также должны быть осторожны, ничего не сломают. Вы не можете (или, возможно, не должны) просто вызвать эту версию метод напрямую.

Но, в конце концов, если это сработает для вас, то это хороший простой подход.

person StayOnTarget    schedule 17.04.2020