Files
ShrlAlgoToolkit/Melskin/Controls/MelWindow.xaml
2026-02-17 22:17:23 +08:00

458 lines
28 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:assists="clr-namespace:Melskin.Assists"
xmlns:controls="clr-namespace:Melskin.Controls">
<ControlTemplate x:Key="WindowNormalButtonTemplate" TargetType="{x:Type Button}">
<Border
x:Name="border"
Background="{TemplateBinding Background}"
SnapsToDevicePixels="True">
<ContentPresenter
x:Name="contentPresenter"
Margin="{TemplateBinding Padding}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Focusable="False"
RecognizesAccessKey="True"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Border>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Property="Background" Value="Transparent" />
</MultiTrigger.Conditions>
<Setter TargetName="border" Property="Background" Value="{DynamicResource BackgroundLayoutBrush}" />
<!--<Setter TargetName="border" Property="Effect">
<Setter.Value>
<effects:BrightnessContrastEffect Brightness="0.1" />
</Setter.Value>
</Setter>-->
<Setter TargetName="border" Property="Background" Value="#1A000000" />
<Setter Property="Opacity" Value="1" />
</MultiTrigger>
<Trigger Property="IsPressed" Value="True">
<!--<Setter TargetName="border" Property="Effect">
<Setter.Value>
<effects:BrightnessContrastEffect Brightness="0.05" />
</Setter.Value>
</Setter>-->
<Setter TargetName="border" Property="Background" Value="#33000000" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="{DynamicResource ControlBackgroundDisabledBrush}" />
<Setter TargetName="contentPresenter" Property="TextElement.Foreground" Value="{Binding Path=(assists:ShadingAssist.DisabledForeground), RelativeSource={RelativeSource TemplatedParent}}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<ControlTemplate x:Key="WindowCloseButtonTemplate" TargetType="{x:Type Button}">
<Border
x:Name="border"
Background="{TemplateBinding Background}"
SnapsToDevicePixels="True">
<ContentPresenter
x:Name="contentPresenter"
Margin="{TemplateBinding Padding}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Focusable="False"
RecognizesAccessKey="True"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Background" Value="#E81123" />
<Setter Property="Foreground" Value="#e0e0e0" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="border" Property="Background" Value="#F1707A" />
<Setter Property="Foreground" Value="#edbebb" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="{DynamicResource ControlBackgroundDisabledBrush}" />
<Setter Property="Foreground" Value="{Binding Path=(assists:ShadingAssist.DisabledForeground), RelativeSource={RelativeSource TemplatedParent}}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<!-- 窗口标题按钮 -->
<Style x:Key="WindowButton" TargetType="{x:Type Button}">
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="Focusable" Value="False" />
<Setter Property="UseLayoutRounding" Value="True" />
<Setter Property="assists:ShadingAssist.DisabledForeground" Value="{DynamicResource TextDisabledBrush}" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource TextPrimaryBrush}" />
<Setter Property="FocusVisualStyle" Value="{DynamicResource FocusVisual}" />
<Setter Property="FontSize" Value="14" />
<!--<Setter Property="WindowChrome.IsHitTestVisibleInChrome" Value="True" />-->
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Width" Value="46" />
<Setter Property="Height" Value="32" />
<Setter Property="Template" Value="{StaticResource WindowNormalButtonTemplate}" />
<Style.Triggers>
<Trigger Property="Tag" Value="Close">
<Setter Property="Template" Value="{StaticResource WindowCloseButtonTemplate}" />
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="WindowCloseButton" TargetType="{x:Type Button}">
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="Focusable" Value="False" />
<Setter Property="UseLayoutRounding" Value="True" />
<Setter Property="assists:ShadingAssist.DisabledForeground" Value="{DynamicResource TextDisabledBrush}" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource TextPrimaryBrush}" />
<Setter Property="FocusVisualStyle" Value="{DynamicResource FocusVisual}" />
<Setter Property="FontSize" Value="14" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Width" Value="46" />
<Setter Property="Height" Value="32" />
<Setter Property="Template" Value="{StaticResource WindowNormalButtonTemplate}" />
</Style>
<Style x:Key="ResizeGripStyle" TargetType="{x:Type ResizeGrip}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Height" Value="18" />
<Setter Property="HorizontalAlignment" Value="Right" />
<Setter Property="Opacity" Value="0.75" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ResizeGrip}">
<Grid
Width="18"
Height="18"
Background="{TemplateBinding Background}"
SnapsToDevicePixels="True">
<Grid.Resources>
<Style TargetType="Rectangle">
<!--<Setter Property="Fill" Value="{Binding BorderBackgroundBrush, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" />-->
<Setter Property="Fill" Value="{DynamicResource TextSecondaryBrush}" />
<Setter Property="Height" Value="2" />
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="VerticalAlignment" Value="Top" />
<Setter Property="Width" Value="2" />
</Style>
</Grid.Resources>
<Rectangle Margin="14,2,0,0" />
<Rectangle Margin="14,6,0,0" />
<Rectangle Margin="14,10,0,0" />
<Rectangle Margin="14,14,0,0" />
<Rectangle Margin="10,6,0,0" />
<Rectangle Margin="10,10,0,0" />
<Rectangle Margin="10,14,0,0" />
<Rectangle Margin="6,10,0,0" />
<Rectangle Margin="6,14,0,0" />
<Rectangle Margin="2,14,0,0" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="VerticalAlignment" Value="Bottom" />
<Setter Property="Visibility" Value="Collapsed" />
<Setter Property="Width" Value="18" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=ResizeMode, RelativeSource={RelativeSource TemplatedParent}}" Value="CanResizeWithGrip">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="NeoWindowStyle" TargetType="controls:MelWindow">
<Setter Property="Background" Value="{DynamicResource BackgroundLayoutBrush}" />
<Setter Property="MinWidth" Value="300" />
<Setter Property="WindowChrome.WindowChrome">
<Setter.Value>
<WindowChrome CaptionHeight="32" UseAeroCaptionButtons="True">
<!--<WindowChrome.ResizeBorderThickness>6</WindowChrome.ResizeBorderThickness>
<WindowChrome.NonClientFrameEdges>Left,Bottom,Right</WindowChrome.NonClientFrameEdges>-->
</WindowChrome>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="controls:MelWindow">
<ControlTemplate.Resources>
<!-- 激活窗口后窗口内容逐渐清晰不透明度增加到1 -->
<Storyboard x:Key="OpacityInStoryboard">
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
From="0.75"
To="1"
Duration="0:0:0.2">
<DoubleAnimation.EasingFunction>
<SineEase EasingMode="EaseOut" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
<Storyboard x:Key="OpacityOutStoryboard">
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
From="1"
To="0.75"
Duration="0:0:0.2">
<DoubleAnimation.EasingFunction>
<SineEase EasingMode="EaseOut" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</ControlTemplate.Resources>
<Border x:Name="windowBorder">
<Border.Style>
<Style TargetType="{x:Type Border}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=WindowState, RelativeSource={RelativeSource TemplatedParent}}" Value="Normal">
<Setter Property="Padding" Value="0" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=WindowState, RelativeSource={RelativeSource TemplatedParent}}" Value="Maximized">
<Setter Property="Padding" Value="8" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid x:Name="RootGrid" Background="{TemplateBinding Background}">
<Grid.RowDefinitions>
<RowDefinition Height="32" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<!-- 自定义标题栏 -->
<!-- 上方背景 -->
<Border
Grid.Row="0"
Grid.Column="0"
Grid.ColumnSpan="3"
Background="{TemplateBinding assists:ColorAssist.TitleBarBackground}" />
<StackPanel
Grid.Row="0"
Grid.Column="0"
Orientation="Horizontal">
<!-- 图标容器 -->
<Image
Margin="10,10,4,4"
VerticalAlignment="Center"
Panel.ZIndex="2048"
RenderOptions.BitmapScalingMode="HighQuality"
Source="{TemplateBinding Icon}"
Stretch="Uniform" />
<!-- 左侧标题栏容器 -->
<ContentControl
x:Name="LeftContent"
Margin="0,6,8,0"
VerticalAlignment="Center"
VerticalContentAlignment="Center"
Content="{TemplateBinding TitleBarLeftContent}"
WindowChrome.IsHitTestVisibleInChrome="True" />
</StackPanel>
<!-- 标题 -->
<Label
Grid.Row="0"
Grid.Column="1"
Margin="0,6,0,0"
Padding="12,2"
HorizontalAlignment="Left">
<TextBlock
x:Name="TitleBlock"
FontSize="14"
Foreground="{DynamicResource TextPrimaryBrush}"
Text="{TemplateBinding Title}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=WindowStyle, RelativeSource={RelativeSource TemplatedParent}}" Value="None">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=FadeContentIfInactive, RelativeSource={RelativeSource TemplatedParent}}" Value="True" />
<Condition Binding="{Binding Path=IsActive, RelativeSource={RelativeSource TemplatedParent}}" Value="True" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource OpacityInStoryboard}" />
</MultiDataTrigger.EnterActions>
<MultiDataTrigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource OpacityOutStoryboard}" />
</MultiDataTrigger.ExitActions>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Label>
<StackPanel
Grid.Row="0"
Grid.Column="2"
HorizontalAlignment="Right"
Orientation="Horizontal"
WindowChrome.IsHitTestVisibleInChrome="True">
<!-- 右侧内容容器 -->
<ContentControl
x:Name="RightContent"
VerticalAlignment="Center"
VerticalContentAlignment="Center"
Content="{TemplateBinding TitleBarRightContent}"
WindowChrome.IsHitTestVisibleInChrome="True" />
<!-- 功能按钮 -->
<Button x:Name="minimizeButton" ToolTip="最小化">
<Button.Style>
<Style BasedOn="{StaticResource WindowButton}" TargetType="Button">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=ResizeMode, RelativeSource={RelativeSource AncestorType=Window}}" Value="NoResize">
<Setter Property="IsEnabled" Value="False" />
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
<controls:IconElement
Padding="0,-14,0,0"
FontSize="24"
Foreground="{Binding ElementName=minimizeButton, Path=Foreground}"
SnapsToDevicePixels="True"
Symbol="Minimize"
UseLayoutRounding="True" />
</Button>
<Button x:Name="maximizeRestoreButton">
<Button.Style>
<Style BasedOn="{StaticResource WindowButton}" TargetType="Button">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=WindowState, RelativeSource={RelativeSource TemplatedParent}}" Value="Normal">
<!-- 最大化 -->
<Setter Property="Content">
<Setter.Value>
<controls:IconElement FontSize="20" Symbol="Fullscreen" />
</Setter.Value>
</Setter>
<!-- 提示 -->
<!--<Setter Property="ToolTip" Value="最大化" />-->
</DataTrigger>
<DataTrigger Binding="{Binding Path=WindowState, RelativeSource={RelativeSource TemplatedParent}}" Value="Maximized">
<Setter Property="Content">
<Setter.Value>
<!-- 恢复 -->
<controls:IconElement FontSize="20" Symbol="FullscreenExit" />
</Setter.Value>
</Setter>
<!--<Setter Property="ToolTip" Value="恢复" />-->
</DataTrigger>
<!-- 切换显示 -->
<DataTrigger Binding="{Binding Path=ResizeMode, RelativeSource={RelativeSource AncestorType=Window}}" Value="NoResize">
<Setter Property="IsEnabled" Value="False" />
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=ResizeMode, RelativeSource={RelativeSource AncestorType=Window}}" Value="CanMinimize">
<Setter Property="IsEnabled" Value="False" />
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
<Button
x:Name="closeButton"
ToolTip="关闭"
WindowChrome.IsHitTestVisibleInChrome="True">
<Button.Style>
<Style BasedOn="{StaticResource WindowButton}" TargetType="Button">
<Setter Property="Tag" Value="Close" />
<!--<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{DynamicResource ErrorBrush}" />
<Setter Property="Foreground" Value="#e0e0e0" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="{DynamicResource ErrorPressedBrush}" />
<Setter Property="Foreground" Value="#edbebb" />
</Trigger>
</Style.Triggers>-->
</Style>
</Button.Style>
<controls:IconElement
FontSize="22"
Foreground="{Binding ElementName=closeButton, Path=Foreground}"
SnapsToDevicePixels="True"
Symbol="Close"
UseLayoutRounding="True" />
</Button>
</StackPanel>
<!-- 窗体内容 -->
<Border
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="3"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Panel.ZIndex="1000"
Background="{TemplateBinding Background}">
<AdornerDecorator>
<ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}">
<ContentPresenter.Style>
<Style TargetType="ContentPresenter">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=FadeContentIfInactive, RelativeSource={RelativeSource TemplatedParent}}" Value="True" />
<Condition Binding="{Binding Path=IsActive, RelativeSource={RelativeSource TemplatedParent}}" Value="True" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource OpacityInStoryboard}" />
</MultiDataTrigger.EnterActions>
<MultiDataTrigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource OpacityOutStoryboard}" />
</MultiDataTrigger.ExitActions>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</ContentPresenter.Style>
</ContentPresenter>
</AdornerDecorator>
</Border>
<ResizeGrip
x:Name="resizeGrip"
Grid.Row="1"
Grid.Column="2"
Panel.ZIndex="2048"
Style="{StaticResource ResizeGripStyle}" />
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="WindowState" Value="Normal">
<Setter Property="WindowChrome.WindowChrome">
<Setter.Value>
<WindowChrome ResizeBorderThickness="4" />
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="WindowState" Value="Maximized">
<Setter Property="WindowChrome.WindowChrome">
<Setter.Value>
<WindowChrome ResizeBorderThickness="0" />
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="ResizeMode" Value="CanResizeWithGrip">
<Setter Property="WindowChrome.WindowChrome">
<Setter.Value>
<WindowChrome ResizeBorderThickness="4,4,18,18" />
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
<Style BasedOn="{StaticResource NeoWindowStyle}" TargetType="controls:MelWindow" />
</ResourceDictionary>