微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何替换MahApps MetroWindow的Maximize/RestoreDown图标

如何解决如何替换MahApps MetroWindow的Maximize/RestoreDown图标

我在 WPF 应用程序中使用 MahApps.Metro 并尝试将 MetrowWindowMaximize/RestoreDown 图标更改为以下新的 FullScreen/BackToWindow 图标:

enter image description here

问题:我们如何替换Maximize/RestoreDownMetrowWindow图标?

备注:按照here的建议,我尝试了以下代码,但它仍然显示旧样式 - 如下所示。我可能在这里遗漏了一些东西并且做得不对。新图标不是问题。我只需要知道我们如何用新的替换旧的。

enter image description here

<mah:MetroWindow x:Class="WPF_Mah_Metro_Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mah="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
        xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_Mah_Metro_Test"
        mc:Ignorable="d"
        GlowBrush="{DynamicResource MahApps.Brushes.Accent}"
        ResizeMode="CanResizeWithgrip"
        WindowStartupLocation="CenterScreen"
        Height="450" Width="800">

    <mah:MetroWindow.WindowButtonCommands>
        <mah:WindowButtonCommands Template="{DynamicResource MahApps.Templates.WindowButtonCommands.Win10}" />
    </mah:MetroWindow.WindowButtonCommands>

    <Grid>
    </Grid>

解决方法

为了自定义窗口按钮,您必须为 WindowButtonCommands 类型创建自定义控件模板。您可以复制 from GitHub 下面的默认控件模板之一。

我采用了 Win10 控制模板,并在 PART_Max 按钮中调整了两件事:

  1. Data PART_MaxPathPath 更改为代表图标的适当路径或将其替换为使用 Segoe MDL2 Assets 字体并显示的 TexBlock字形。
  2. 更改 DataTriggerMaximized 以相同方式设置适当的图标。

在下面的示例中,我使用了 TextBlock 方法,因为我没有图标的路径数据。请注意,Path 变体始终有效,而 TextBlock 变体要求字体在您的系统上可用

<ControlTemplate x:Key="MahApps.Templates.WindowButtonCommands.Custom"
                 TargetType="{x:Type mah:WindowButtonCommands}">
   <StackPanel Orientation="Horizontal">
      <Button x:Name="PART_Min"
              Width="46"
              AutomationProperties.AutomationId="Minimize"
              AutomationProperties.Name="Minimize"
              Command="{x:Static SystemCommands.MinimizeWindowCommand}"
              Focusable="False"
              IsEnabled="{Binding IsMinButtonEnabled,RelativeSource={RelativeSource AncestorType={x:Type mah:MetroWindow}}}"
              ToolTip="{Binding Minimize,RelativeSource={RelativeSource TemplatedParent},Mode=OneWay}"
              UseLayoutRounding="True">
         <Button.Visibility>
            <MultiBinding Converter="{x:Static converters:ResizeModeMinMaxButtonVisibilityConverter.Instance}"
                          ConverterParameter="MIN">
               <Binding Mode="OneWay"
                        Path="ShowMinButton"
                        RelativeSource="{RelativeSource AncestorType={x:Type mah:MetroWindow}}" />
               <Binding Mode="OneWay"
                        Path="UseNoneWindowStyle"
                        RelativeSource="{RelativeSource AncestorType={x:Type mah:MetroWindow}}" />
               <Binding Mode="OneWay"
                        Path="ResizeMode"
                        RelativeSource="{RelativeSource AncestorType={x:Type mah:MetroWindow}}" />
            </MultiBinding>
         </Button.Visibility>
         <Path Width="10"
               Height="10"
               HorizontalAlignment="Center"
               VerticalAlignment="Center"
               Data="M0,0L10,0 10,1 10,1 1,1 0,1z"
               Fill="{Binding Path=Foreground,RelativeSource={RelativeSource AncestorType={x:Type Button}}}"
               RenderOptions.EdgeMode="Aliased"
               SnapsToDevicePixels="True"
               Stretch="Uniform" />
      </Button>
      <Button x:Name="PART_Max"
              Width="46"
              AutomationProperties.AutomationId="MaximizeRestore"
              AutomationProperties.Name="Maximize"
              Command="{x:Static SystemCommands.MaximizeWindowCommand}"
              Focusable="False"
              IsEnabled="{Binding IsMaxRestoreButtonEnabled,RelativeSource={RelativeSource AncestorType={x:Type mah:MetroWindow}}}"
              ToolTip="{Binding Maximize,Mode=OneWay}"
              UseLayoutRounding="True">
         <Button.Visibility>
            <MultiBinding Converter="{x:Static converters:ResizeModeMinMaxButtonVisibilityConverter.Instance}"
                          ConverterParameter="MAX">
               <Binding Mode="OneWay"
                        Path="ShowMaxRestoreButton"
                        RelativeSource="{RelativeSource AncestorType={x:Type mah:MetroWindow}}" />
               <Binding Mode="OneWay"
                        Path="UseNoneWindowStyle"
                        RelativeSource="{RelativeSource AncestorType={x:Type mah:MetroWindow}}" />
               <Binding Mode="OneWay"
                        Path="ResizeMode"
                        RelativeSource="{RelativeSource AncestorType={x:Type mah:MetroWindow}}" />
            </MultiBinding>
         </Button.Visibility>
         <!--  normal state  -->
         <TextBlock x:Name="PART_MaxPath"
                    FontFamily="Segoe MDL2 Assets"
                    FontSize="16"
                    Text="&#xE740;" />
      </Button>
      <Button x:Name="PART_Close"
              Width="46"
              AutomationProperties.AutomationId="Close"
              AutomationProperties.Name="Close"
              Command="{x:Static SystemCommands.CloseWindowCommand}"
              Focusable="False"
              IsEnabled="{Binding RelativeSource={RelativeSource AncestorType={x:Type mah:MetroWindow}},Path=IsCloseButtonEnabled,Mode=OneWay}"
              ToolTip="{Binding Close,Mode=OneWay}"
              UseLayoutRounding="True">
         <Button.Visibility>
            <MultiBinding Converter="{x:Static converters:ResizeModeMinMaxButtonVisibilityConverter.Instance}"
                          ConverterParameter="CLOSE">
               <Binding Mode="OneWay"
                        Path="ShowCloseButton"
                        RelativeSource="{RelativeSource AncestorType={x:Type mah:MetroWindow}}" />
               <Binding Mode="OneWay"
                        Path="UseNoneWindowStyle"
                        RelativeSource="{RelativeSource AncestorType={x:Type mah:MetroWindow}}" />
            </MultiBinding>
         </Button.Visibility>
         <Path Width="10"
               Height="10"
               HorizontalAlignment="Center"
               VerticalAlignment="Center"
               Data="F1M8.583,8L13,12.424 12.424,13 8,8.583 3.576,13 3,12.424 7.417,8 3,3.576 3.576,3 8,7.417 12.424,3 13,3.576z"
               Fill="{Binding Path=Foreground,RelativeSource={RelativeSource AncestorType={x:Type Button}}}"
               RenderOptions.EdgeMode="Aliased"
               SnapsToDevicePixels="True"
               Stretch="Uniform" />
      </Button>
   </StackPanel>
   <ControlTemplate.Triggers>
      <MultiDataTrigger>
         <MultiDataTrigger.Conditions>
            <Condition Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type mah:MetroWindow}},Path=IsCloseButtonEnabled}"
                       Value="True" />
            <Condition Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type mah:MetroWindow}},Path=IsAnyDialogOpen}"
                       Value="True" />
            <Condition Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type mah:MetroWindow}},Path=IsCloseButtonEnabledWithDialog}"
                       Value="False" />
         </MultiDataTrigger.Conditions>
         <Setter TargetName="PART_Close"
                 Property="IsEnabled"
                 Value="False" />
      </MultiDataTrigger>
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type mah:MetroWindow}},Path=WindowState}"
                   Value="Maximized">
         <Setter TargetName="PART_Max"
                 Property="AutomationProperties.Name"
                 Value="Restore" />
         <Setter TargetName="PART_Max"
                 Property="Command"
                 Value="{x:Static SystemCommands.RestoreWindowCommand}" />
         <Setter TargetName="PART_Max"
                 Property="ToolTip"
                 Value="{Binding Restore,Mode=OneWay}" />
         <Setter TargetName="PART_MaxPath"
                 Property="Text"
                 Value="&#xE73F;" />
      </DataTrigger>
      <Trigger Property="Theme"
               Value="Light">
         <Setter TargetName="PART_Close"
                 Property="Style"
                 Value="{Binding RelativeSource={RelativeSource TemplatedParent},Path=LightCloseButtonStyle}" />
         <Setter TargetName="PART_Max"
                 Property="Style"
                 Value="{Binding RelativeSource={RelativeSource TemplatedParent},Path=LightMaxButtonStyle}" />
         <Setter TargetName="PART_Min"
                 Property="Style"
                 Value="{Binding RelativeSource={RelativeSource TemplatedParent},Path=LightMinButtonStyle}" />
      </Trigger>
      <Trigger Property="Theme"
               Value="Dark">
         <Setter TargetName="PART_Close"
                 Property="Style"
                 Value="{Binding RelativeSource={RelativeSource TemplatedParent},Path=DarkCloseButtonStyle}" />
         <Setter TargetName="PART_Max"
                 Property="Style"
                 Value="{Binding RelativeSource={RelativeSource TemplatedParent},Path=DarkMaxButtonStyle}" />
         <Setter TargetName="PART_Min"
                 Property="Style"
                 Value="{Binding RelativeSource={RelativeSource TemplatedParent},Path=DarkMinButtonStyle}" />
      </Trigger>
   </ControlTemplate.Triggers>
</ControlTemplate>

按照与您的问题相同的方式将自定义 WindowButtonCommands 模板 MahApps.Templates.WindowButtonCommands.Custom 设置为 MetroWindow。确保控制模板资源在范围内。

<mah:MetroWindow.WindowButtonCommands>
   <mah:WindowButtonCommands Template="{StaticResource MahApps.Templates.WindowButtonCommands.Custom}" />
</mah:MetroWindow.WindowButtonCommands>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。