Применить стиль для кнопок во всех Windows в WPF

У меня есть настройка стиля в моем XAML для создания круглого угла Button в моем окне WPF. Я бы хотел, чтобы этот стиль применялся ко всем кнопкам во всех окнах моего приложения.

Есть ли способ, похожий на CSS, что я могу поместить его в другой файл и каким-то образом ссылаться на него во всех моих окнах? Или мне просто нужно копировать и вставлять его каждый раз.

Ответ 1

Вы можете использовать ресурсы приложения для этого.

Вот немного кода, например (в app.xaml)

<Application.Resources>
  <Style TargetType="Button" x:Key="GelButton" >
     <Setter Property="Margin" Value="1,2,1,2"/>
     <Setter Property="HorizontalAlignment" Value="Left"/>
  </Style>
</Application.Resources>

а затем для ваших кнопок (например):

<Button Height="50" Width="250" Style="{StaticResource GelButton}" Content="Button 1" />
<Button Height="50" Width="250" Style="{StaticResource GelButton}" Content="Button 2" />

Надеюсь, это поможет вам найти то, что вы ищете.

Ответ 2

Если вы хотите сделать это чистым способом, вы можете создать ResourceDictionary.xaml, который имеет ту же функцию, что CSS в веб-дизайне.

Сначала перейдите в свой проект и добавьте ResourceDictionary. Внутри вы можете добавлять стили для всех желаемых элементов, например, изменить цвет фона Button, который применяется ко всем вашим кнопкам:

// Base style for all buttons
<Style TargetType="Button">
    <Setter Property="Background" Value="Red" />
</Style>

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

// Specific style for blue buttons
<Style TargetType="Button" x:Key="BlueButton">
    <Setter Property="Background" Value="Blue" />
</Style>

Затем на каждом .xaml, который вы хотите применить к стилям, вы должны добавить ссылку на этот ResourceDictionary.xaml, который вы создаете:

<Window.... >
    <Window.References>
        <ResourceDictionary>
           <ResourceDictionary Source="MyResourceDictionary.xaml" />
        </ResourceDictionary>
    </Window.References>

    <Grid>
       <Button Content="Button with red background" />
       <Button Style="{StaticResource BlueButton}" Content="Button with blue background" />
    </Grid>
</Window>

Я думаю, что это то, что вы ищете.

Если вы хотите нарисовать закругленную кнопку, вам необходимо переопределить свойство Template кнопки. Это означает, что вам нужно сообщить кнопке все действия, которые необходимо выполнить с момента ее замены. См. здесь. Итак, в небольшой и сокращенной концепции вы хотели бы написать что-то вроде этого:

<Style TargetType="Button">
    <Setter Property="SnapsToDevicePixels" Value="True" />
    <Setter Property="Foreground" Value="White" />
    <Setter Property="Background" Value="DarkBlue" />
    <Setter Property="Width" Value="150" />
    <Setter Property="Height" Value="35" />
    <Setter Property="FontSize" Value="16" />
    <Setter Property="FontFamily" Value="Calibri" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Background="{TemplateBinding Background}"
                    BorderBrush="LightBlue" BorderThickness="1" CornerRadius="15,0,15,0" x:Name="bd">
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                    Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
                    SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True" />
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="bd" Property="Background" Value="LightGray"/>
                        <Setter Property="Foreground" Value="White" />
                        <Setter Property="Cursor" Value="Hand" />
                    </Trigger>

                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Смотрите, что здесь я переопределяю все основные свойства, необходимые для рисования базовой функциональной кнопки, например Foreground, Background, Width... и события MouseOver, чтобы изменить цвет при прокрутке мыши над ним. Свойством CornerRadius Border внутри ControlTemplate является радиус, который вы ищете.

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

Ответ 3

Справочный словарь Google. Вы можете разместить все свои стили. затем просто добавьте ссылку на него в вашем окне/пользовательском элементе управления.

    <UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/SialTPChat.UI.Design;component/Styles/Styles.xaml" />
    </ResourceDictionary>
    </UserControl.Resources>

Теперь все стили в вышеупомянутом файле XAML, на который ссылается, будут применены ко всем объектам в пользовательском элементе управления.

Ответ 4

Самый легкий способ по мне:

  • Щелкните правой кнопкой мыши по кнопке на поверхности дизайна

  • Выберите "Редактировать шаблон" → "Редактировать копию"

  • Выберите переключатель "Определить в приложении"

  • Стиль будет создан в файле App.xaml

  • Добавьте этот ресурс каждой кнопке, используя тег