如何解决如何替换MahApps MetroWindow的Maximize/RestoreDown图标
我在 WPF 应用程序中使用 MahApps.Metro 并尝试将 MetrowWindow 的 Maximize/RestoreDown
图标更改为以下新的 FullScreen/BackToWindow
图标:
问题:我们如何替换Maximize/RestoreDown
的默认MetrowWindow
图标?
备注:按照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
按钮中调整了两件事:
- 将
Data
PART_MaxPath
的Path
更改为代表图标的适当路径或将其替换为使用 Segoe MDL2 Assets 字体并显示的TexBlock
字形。 - 更改
DataTrigger
的Maximized
以相同方式设置适当的图标。
在下面的示例中,我使用了 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="" />
</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="" />
</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 举报,一经查实,本站将立刻删除。