自定义按钮内容时忽略按钮字体属性

0x8BADF00D

我有以下设置:

<Button x:Name="DeleteFilter" Margin="5" Grid.Column="1" Padding="2">
    <StackPanel Orientation="Horizontal">
        <Rectangle Height="9" Width="9" Stretch="Fill" Margin="5 3">
            <Rectangle.Fill>
                <VisualBrush Visual="{StaticResource appbar_delete}"/>
            </Rectangle.Fill>
        </Rectangle>
        <TextBlock Text="{Resx DeleteFilter}"/>
    </StackPanel>
</Button>

但是,启动我的应用程序时,我得到以下结果,这不是我想要的。当我Content手动设置按钮属性时,所有字体属性似乎都将被忽略

现场示例:

在此处输入图片说明

我想拥有与右键相同的fontstyle和fontsize。我尝试使用StaticResource手动指定样式DynamicResource,如下所示:

<Button Style="{StaticResource MetroButton}"....

但什么都没有改变。

我猜想我需要实现一种样式,该样式将覆盖现有样式,并将格式传递给TextBlock元素,但是我不知道如何做到这一点。


右侧的“ LOAD FILTERS”工作按钮:

<Button x:Name="LoadFilter" Content="{Resx LoadFilters}" Margin="5" Grid.Column="2"/>

MahApps.Metro的标准按钮(MetroButton)包含在文件中。

我应用于图标按钮的样式:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="MetroIconButton" BasedOn="{StaticResource MetroButton}" TargetType="{x:Type Button}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <StackPanel Orientation="Horizontal">
                        <Rectangle Height="9" Width="9" Margin="5 3" Stretch="Fill">
                            <Rectangle.Fill>
                                <VisualBrush Visual="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}}"/>
                            </Rectangle.Fill>
                        </Rectangle>
                        <ContentPresenter/>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
Pushpraj

在您的设置中,StackPanel用作不太理想的内容,您可以创建一种样式,其中包含模板和所需的字体属性设置器,以使其与应用程序中所需的按钮保持一致。

因此,如果我尝试为您创建按钮样式,那将是

<Style x:Key="MetroButton" TargetType="{x:Type Button}">
  <Setter Property="FontSize" Value="13"/>
  <Setter Property="Template">
      <Setter.Value>
          <ControlTemplate TargetType="Button">
              <StackPanel Orientation="Horizontal">
                  <Rectangle Height="9" Width="9" Margin="5 3" Stretch="Fill">
                      <Rectangle.Fill>
                          <VisualBrush Visual="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}}"/>
                      </Rectangle.Fill>
                  </Rectangle>
                  <ContentPresenter/>
              </StackPanel>
          </ControlTemplate>
      </Setter.Value>
  </Setter>
</Style>

然后我会在按钮上使用这种样式

<Button Content="Delete" Style="{StaticResource MetroButton}" Tag="{StaticResource appbar_delete}"/>

利用ContentTemplate进行更新以在利用现有模板的同时实现相同的目的。

 <Style x:Key="MetroIconButton" BasedOn="{StaticResource MetroButton}" TargetType="{x:Type Button}">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate >
                <StackPanel Orientation="Horizontal">
                    <Rectangle Height="9" Width="9" Margin="5 3" Stretch="Fill">
                        <Rectangle.Fill>
                            <VisualBrush Visual="{Binding Tag, RelativeSource={RelativeSource FindAncestor, AncestorType=Button}}"/>
                        </Rectangle.Fill>
                    </Rectangle>
                    <ContentControl Content="{Binding}"/>
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

用法除样式外保持不变 MetroIconButton

<Button Content="Delete" Style="{StaticResource MetroIconButton}" Tag="{StaticResource appbar_delete}"/>

我正在使用Tag属性来保存图标,以便为您即插即用,但更好的是将附件属性用于该图标。l:ExtraProperties.Icon={StaticResource appbar_delete}",如果您也需要的话,我可以提供一个样本。

实际上,在以前的样式中,我们重写了MetroButton样式中定义的模板,因此它失败了。在查看了MetroButton样式的原始实现之后,我想出了ContentTemplate的方法来实现相同的目的。因此,代替设置模板,我们将设置内容模板,该模板将由MetroButton样式拾取并应用于内容。

使用附加属性

声明一个继承DependencyObject或其任何派生类的类以及所需的属性,如下所述

class ExtraProperties: DependencyObject
{
    public static Visual GetIcon(DependencyObject obj)
    {
        return (Visual)obj.GetValue(IconProperty);
    }

    public static void SetIcon(DependencyObject obj, Visual value)
    {
        obj.SetValue(IconProperty, value);
    }

    // Using a DependencyProperty as the backing store for Icon.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IconProperty = DependencyProperty.RegisterAttached("Icon", typeof(Visual), typeof(ExtraProperties), new PropertyMetadata(null));
}

将名称空间添加到您的XAML

<Window x:Class="Example.MainWindow"
    ...
    xmlns:l="clr-namespace:Example">

然后将样式更改为

<VisualBrush Visual="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Button}, Path=(l:ExtraProperties.Icon)}"/>

和用法

<Button Content="Delete" Style="{StaticResource MetroIconButton}" l:ExtraProperties.Icon="{StaticResource appbar_delete}"/>

使用附加属性是一种更WPF的方法,而不是破解可能无法保证按预期方式运行的其他属性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档