refactor(工具栏): 将BorderTools从Border改为Popup控件并优化显示逻辑

重构工具栏中的BorderTools控件,将其从Border改为Popup控件,并添加自定义位置回调
优化显示/隐藏逻辑,使用IsOpen属性替代Visibility控制
更新相关动画效果调用为对应的Popup版本
调整UI样式和布局,提升视觉一致性
This commit is contained in:
PrefacedCorg
2026-05-02 15:55:37 +08:00
parent 09713f70bf
commit 35c8e980f8
7 changed files with 74 additions and 59 deletions
@@ -99,10 +99,15 @@ namespace Ink_Canvas.Controls.Toolbar
visible = cfg.Visible; visible = cfg.Visible;
try try
{ {
var menuElement = host.Window.FindName(item.MenuPanelName) as FrameworkElement; var menuElement = host.Window.FindName(item.MenuPanelName);
if (menuElement != null) if (menuElement is System.Windows.Controls.Primitives.Popup popup)
{ {
menuElement.Visibility = visible ? Visibility.Visible : Visibility.Collapsed; popup.IsOpen = visible;
LogHelper.WriteLogToFile($"ToolbarRegistry: 菜单 Popup [{item.MenuPanelName}] -> {(visible ? "Open" : "Closed")}", LogHelper.LogType.Info);
}
else if (menuElement is FrameworkElement fe)
{
fe.Visibility = visible ? Visibility.Visible : Visibility.Collapsed;
LogHelper.WriteLogToFile($"ToolbarRegistry: 菜单 [{item.MenuPanelName}] -> {(visible ? "Visible" : "Collapsed")}", LogHelper.LogType.Info); LogHelper.WriteLogToFile($"ToolbarRegistry: 菜单 [{item.MenuPanelName}] -> {(visible ? "Visible" : "Collapsed")}", LogHelper.LogType.Info);
} }
else else
+40 -40
View File
@@ -2985,53 +2985,53 @@
<Grid Width="0" d:Visibility="Visible"> <Grid Width="0" d:Visibility="Visible">
</Grid> </Grid>
</ikw:SimpleStackPanel> </ikw:SimpleStackPanel>
<Border Name="BorderTools" <Popup x:Name="BorderTools"
Visibility="Collapsed" d:Visibility="Visible" Placement="Custom"
Margin="-103,-156,-16,37" CornerRadius="6" AllowsTransparency="True"
Background="{DynamicResource FloatBarBackground}" StaysOpen="True"
BorderBrush="#2563eb" BorderThickness="1"> IsOpen="False">
<ikw:SimpleStackPanel Margin="-1"> <Border CornerRadius="6" Background="#F4F4F5"
<Border BorderBrush="#1e3a8a" BorderThickness="0,0,0,1" CornerRadius="8,8,0,0" Background="#2563eb"> BorderBrush="#3b82f6" BorderThickness="1">
<Grid Margin="5"> <ikw:SimpleStackPanel Margin="-1">
<Grid Margin="8,8,8,5">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" VerticalAlignment="Center" <TextBlock Grid.Column="0" VerticalAlignment="Center" FontSize="12"
Text="{i18n:I18n Key=Tools_MoreFeaturesTitle}" Text="{i18n:I18n Key=Tools_MoreFeaturesTitle}"
Foreground="White" FontWeight="Bold"/> Foreground="#2563eb" FontWeight="Bold"/>
<ui:FontIcon Grid.Column="1" Icon="{x:Static ui:SegoeFluentIcons.ChromeCloseContrast}" <ui:FontIcon Grid.Column="1" Icon="{x:Static ui:SegoeFluentIcons.ChromeCloseContrast}"
Foreground="White" FontSize="12" Foreground="#DC2626" FontSize="12" VerticalAlignment="Center"
MouseDown="Border_MouseDown" MouseDown="Border_MouseDown"
MouseUp="CloseBordertools_MouseUp" /> MouseUp="CloseBordertools_MouseUp" />
</Grid> </Grid>
</Border> <Border Margin="8,0,8,8" BorderBrush="#D4D4D8" Background="#fafafa" BorderThickness="1"
<!----> CornerRadius="6">
<ikw:SimpleStackPanel Margin="10,3,10,2" Spacing="2"> <ikw:SimpleStackPanel Margin="2" Spacing="1">
<ikw:SimpleStackPanel.Resources> <ikw:SimpleStackPanel.Resources>
<Style TargetType="Label" BasedOn="{StaticResource AutoFitToolPopupLabel8}" /> <Style TargetType="Label" BasedOn="{StaticResource AutoFitToolPopupLabel8}" />
</ikw:SimpleStackPanel.Resources> </ikw:SimpleStackPanel.Resources>
<ikw:SimpleStackPanel Margin="0,0,0,0" Height="40" <ikw:SimpleStackPanel Margin="0,0,0,0" Height="40" Orientation="Horizontal">
Orientation="Horizontal"> <controls:ToolMenuButton x:Name="TimerToolBtn" ButtonMouseUp="ImageCountdownTimer_MouseUp" Label="{i18n:I18n Key=Tools_Timer}" />
<controls:ToolMenuButton x:Name="TimerToolBtn" ButtonMouseUp="ImageCountdownTimer_MouseUp" Label="{i18n:I18n Key=Tools_Timer}" /> <controls:ToolMenuButton x:Name="RandomDrawToolBtn" ButtonMouseUp="SymbolIconRand_MouseUp" Label="{i18n:I18n Key=Tools_RandomDraw}" />
<controls:ToolMenuButton x:Name="RandomDrawToolBtn" ButtonMouseUp="SymbolIconRand_MouseUp" Label="{i18n:I18n Key=Tools_RandomDraw}" /> <controls:ToolMenuButton x:Name="SingleDrawToolBtn" ButtonMouseUp="SymbolIconRandOne_MouseUp" Label="{i18n:I18n Key=Tools_SingleDraw}" />
<controls:ToolMenuButton x:Name="SingleDrawToolBtn" ButtonMouseUp="SymbolIconRandOne_MouseUp" Label="{i18n:I18n Key=Tools_SingleDraw}" /> </ikw:SimpleStackPanel>
</ikw:SimpleStackPanel> <ikw:SimpleStackPanel Margin="0,0,0,0" Height="40" Orientation="Horizontal">
<ikw:SimpleStackPanel Margin="0,0,0,0" Height="40" <controls:ToolMenuButton x:Name="SaveToolBtn" ButtonMouseDown="Border_MouseDown" ButtonMouseUp="SymbolIconSaveStrokes_MouseUp" Label="{i18n:I18n Key=Tools_Save}" />
Orientation="Horizontal"> <controls:ToolMenuButton x:Name="OpenToolBtn" ButtonMouseDown="Border_MouseDown" ButtonMouseUp="SymbolIconOpenStrokes_MouseUp" Label="{i18n:I18n Key=Tools_Open}" />
<controls:ToolMenuButton x:Name="SaveToolBtn" ButtonMouseDown="Border_MouseDown" ButtonMouseUp="SymbolIconSaveStrokes_MouseUp" Label="{i18n:I18n Key=Tools_Save}" /> <controls:ToolMenuButton x:Name="ReplayToolBtn" ButtonMouseUp="GridInkReplayButton_MouseUp" Label="{i18n:I18n Key=Tools_Replay}" />
<controls:ToolMenuButton x:Name="OpenToolBtn" ButtonMouseDown="Border_MouseDown" ButtonMouseUp="SymbolIconOpenStrokes_MouseUp" Label="{i18n:I18n Key=Tools_Open}" /> </ikw:SimpleStackPanel>
<controls:ToolMenuButton x:Name="ReplayToolBtn" ButtonMouseUp="GridInkReplayButton_MouseUp" Label="{i18n:I18n Key=Tools_Replay}" /> <ikw:SimpleStackPanel Margin="0,0,0,0" Height="40" Orientation="Horizontal">
</ikw:SimpleStackPanel> <controls:ToolMenuButton x:Name="ScreenshotToolBtn" ButtonMouseUp="SymbolIconScreenshot_MouseUp" Label="{i18n:I18n Key=Tools_Screenshot}" />
<ikw:SimpleStackPanel Margin="0,0,0,0" Height="40" <controls:ToolMenuButton x:Name="ManualToolBtn" ButtonMouseUp="OperatingGuideWindowIcon_MouseUp" Label="{i18n:I18n Key=Tools_Manual}" />
Orientation="Horizontal"> <controls:ToolMenuButton x:Name="SettingsToolBtn" ButtonMouseUp="SymbolIconSettings_Click" Label="{i18n:I18n Key=Tools_Settings}" />
<controls:ToolMenuButton x:Name="ScreenshotToolBtn" ButtonMouseUp="SymbolIconScreenshot_MouseUp" Label="{i18n:I18n Key=Tools_Screenshot}" /> </ikw:SimpleStackPanel>
<controls:ToolMenuButton x:Name="ManualToolBtn" ButtonMouseUp="OperatingGuideWindowIcon_MouseUp" Label="{i18n:I18n Key=Tools_Manual}" /> </ikw:SimpleStackPanel>
<controls:ToolMenuButton x:Name="SettingsToolBtn" ButtonMouseUp="SymbolIconSettings_Click" Label="{i18n:I18n Key=Tools_Settings}" /> </Border>
</ikw:SimpleStackPanel>
</ikw:SimpleStackPanel> </ikw:SimpleStackPanel>
</ikw:SimpleStackPanel> </Border>
</Border> </Popup>
</ikw:SimpleStackPanel> </ikw:SimpleStackPanel>
</Grid> </Grid>
+8 -1
View File
@@ -108,10 +108,17 @@ namespace Ink_Canvas
PopupPrimaryAxis.Vertical) PopupPrimaryAxis.Vertical)
}; };
BorderTools.CustomPopupPlacementCallback =
(popupSize, targetSize, offset) => new[]
{
new CustomPopupPlacement(
new Point(targetSize.Width / 2 - popupSize.Width / 2, -popupSize.Height),
PopupPrimaryAxis.Vertical)
};
BlackboardLeftSide.Visibility = Visibility.Collapsed; BlackboardLeftSide.Visibility = Visibility.Collapsed;
BlackboardCenterSide.Visibility = Visibility.Collapsed; BlackboardCenterSide.Visibility = Visibility.Collapsed;
BlackboardRightSide.Visibility = Visibility.Collapsed; BlackboardRightSide.Visibility = Visibility.Collapsed;
BorderTools.Visibility = Visibility.Collapsed; BorderTools.IsOpen = false;
LeftSidePanelForPPTNavigation.Visibility = Visibility.Collapsed; LeftSidePanelForPPTNavigation.Visibility = Visibility.Collapsed;
RightSidePanelForPPTNavigation.Visibility = Visibility.Collapsed; RightSidePanelForPPTNavigation.Visibility = Visibility.Collapsed;
TwoFingerGestureBorder.Visibility = Visibility.Collapsed; TwoFingerGestureBorder.Visibility = Visibility.Collapsed;
+1 -1
View File
@@ -34,7 +34,7 @@ namespace Ink_Canvas
else else
{ {
AnimationsHelper.HideWithSlideAndFade(EraserSizePanel); AnimationsHelper.HideWithSlideAndFade(EraserSizePanel);
AnimationsHelper.HideWithSlideAndFade(BorderTools); AnimationsHelper.HidePopupWithSlideAndFade(BorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup); AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
AnimationsHelper.HideWithSlideAndFade(PenPalette); AnimationsHelper.HideWithSlideAndFade(PenPalette);
AnimationsHelper.HideWithSlideAndFade(BoardPenPalette); AnimationsHelper.HideWithSlideAndFade(BoardPenPalette);
+10 -11
View File
@@ -294,7 +294,7 @@ namespace Ink_Canvas
/// </summary> /// </summary>
private void HideSubPanelsImmediately() private void HideSubPanelsImmediately()
{ {
BorderTools.Visibility = Visibility.Collapsed; BorderTools.IsOpen = false;
BoardBorderToolsPopup.IsOpen = false; BoardBorderToolsPopup.IsOpen = false;
PenPalette.Visibility = Visibility.Collapsed; PenPalette.Visibility = Visibility.Collapsed;
BoardPenPalette.Visibility = Visibility.Collapsed; BoardPenPalette.Visibility = Visibility.Collapsed;
@@ -376,7 +376,7 @@ namespace Ink_Canvas
/// </param> /// </param>
internal async void HideSubPanels(string mode = null, bool autoAlignCenter = false) internal async void HideSubPanels(string mode = null, bool autoAlignCenter = false)
{ {
AnimationsHelper.HideWithSlideAndFade(BorderTools); AnimationsHelper.HidePopupWithSlideAndFade(BorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup); AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
AnimationsHelper.HideWithSlideAndFade(PenPalette); AnimationsHelper.HideWithSlideAndFade(PenPalette);
AnimationsHelper.HideWithSlideAndFade(BoardPenPalette); AnimationsHelper.HideWithSlideAndFade(BoardPenPalette);
@@ -1099,7 +1099,7 @@ namespace Ink_Canvas
{ {
LeftUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed; LeftUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed;
RightUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed; RightUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed;
AnimationsHelper.HideWithSlideAndFade(BorderTools); AnimationsHelper.HidePopupWithSlideAndFade(BorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup); AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
AnimationsHelper.HideWithSlideAndFade(BoardImageOptionsPanel); AnimationsHelper.HideWithSlideAndFade(BoardImageOptionsPanel);
@@ -1151,7 +1151,7 @@ namespace Ink_Canvas
/// <param name="e">路由事件参数</param> /// <param name="e">路由事件参数</param>
private void OperatingGuideWindowIcon_MouseUp(object sender, MouseButtonEventArgs e) private void OperatingGuideWindowIcon_MouseUp(object sender, MouseButtonEventArgs e)
{ {
AnimationsHelper.HideWithSlideAndFade(BorderTools); AnimationsHelper.HidePopupWithSlideAndFade(BorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup); AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
AnimationsHelper.HideWithSlideAndFade(BoardImageOptionsPanel); AnimationsHelper.HideWithSlideAndFade(BoardImageOptionsPanel);
@@ -1171,7 +1171,7 @@ namespace Ink_Canvas
LeftUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed; LeftUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed;
RightUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed; RightUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed;
AnimationsHelper.HideWithSlideAndFade(BorderTools); AnimationsHelper.HidePopupWithSlideAndFade(BorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup); AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
AnimationsHelper.HideWithSlideAndFade(BoardImageOptionsPanel); AnimationsHelper.HideWithSlideAndFade(BoardImageOptionsPanel);
@@ -1306,7 +1306,7 @@ namespace Ink_Canvas
LeftUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed; LeftUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed;
RightUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed; RightUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed;
AnimationsHelper.HideWithSlideAndFade(BorderTools); AnimationsHelper.HidePopupWithSlideAndFade(BorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup); AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
AnimationsHelper.HideWithSlideAndFade(BoardImageOptionsPanel); AnimationsHelper.HideWithSlideAndFade(BoardImageOptionsPanel);
@@ -1385,7 +1385,7 @@ namespace Ink_Canvas
{ {
//if (lastBorderMouseDownObject != sender) return; //if (lastBorderMouseDownObject != sender) return;
AnimationsHelper.HideWithSlideAndFade(BorderTools); AnimationsHelper.HidePopupWithSlideAndFade(BorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup); AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
AnimationsHelper.HideWithSlideAndFade(BoardImageOptionsPanel); AnimationsHelper.HideWithSlideAndFade(BoardImageOptionsPanel);
@@ -1687,9 +1687,9 @@ namespace Ink_Canvas
/// <param name="e">鼠标按钮事件参数</param> /// <param name="e">鼠标按钮事件参数</param>
internal void SymbolIconTools_MouseUp(object sender, MouseButtonEventArgs e) internal void SymbolIconTools_MouseUp(object sender, MouseButtonEventArgs e)
{ {
if (BorderTools.Visibility == Visibility.Visible || BoardBorderToolsPopup.IsOpen) if (BorderTools.IsOpen || BoardBorderToolsPopup.IsOpen)
{ {
AnimationsHelper.HideWithSlideAndFade(BorderTools); AnimationsHelper.HidePopupWithSlideAndFade(BorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup); AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
} }
else else
@@ -1697,8 +1697,7 @@ namespace Ink_Canvas
HideSubPanels(); HideSubPanels();
if (currentMode == 0) if (currentMode == 0)
{ {
UpdateBorderToolsPosition(); AnimationsHelper.ShowPopupWithSlideAndFade(BorderTools);
AnimationsHelper.ShowWithSlideFromBottomAndFade(BorderTools);
} }
else else
{ {
@@ -98,7 +98,7 @@ namespace Ink_Canvas
{ {
if (lastBorderMouseDownObject != sender || inkCanvas.Visibility != Visibility.Visible) return; if (lastBorderMouseDownObject != sender || inkCanvas.Visibility != Visibility.Visible) return;
AnimationsHelper.HideWithSlideAndFade(BorderTools); AnimationsHelper.HidePopupWithSlideAndFade(BorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup); AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
GridNotifications.Visibility = Visibility.Collapsed; GridNotifications.Visibility = Visibility.Collapsed;
@@ -916,7 +916,7 @@ namespace Ink_Canvas
private void SymbolIconOpenStrokes_MouseUp(object sender, MouseButtonEventArgs e) private void SymbolIconOpenStrokes_MouseUp(object sender, MouseButtonEventArgs e)
{ {
if (lastBorderMouseDownObject != sender) return; if (lastBorderMouseDownObject != sender) return;
AnimationsHelper.HideWithSlideAndFade(BorderTools); AnimationsHelper.HidePopupWithSlideAndFade(BorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup); AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
var openFileDialog = new OpenFileDialog(); var openFileDialog = new OpenFileDialog();
+5 -1
View File
@@ -32,7 +32,11 @@ namespace Ink_Canvas
internal void AttachSymbolIconRedo(ToolbarImageButton btn) => SymbolIconRedo = btn; internal void AttachSymbolIconRedo(ToolbarImageButton btn) => SymbolIconRedo = btn;
internal void AttachCursorWithDelBtn(ToolbarImageButton btn) => CursorWithDelFloatingBarBtn = btn; internal void AttachCursorWithDelBtn(ToolbarImageButton btn) => CursorWithDelFloatingBarBtn = btn;
internal void AttachWhiteboardBtn(ToolbarImageButton btn) => WhiteboardFloatingBarBtn = btn; internal void AttachWhiteboardBtn(ToolbarImageButton btn) => WhiteboardFloatingBarBtn = btn;
internal void AttachToolsBtn(ToolbarImageButton btn) => ToolsFloatingBarBtn = btn; internal void AttachToolsBtn(ToolbarImageButton btn)
{
ToolsFloatingBarBtn = btn;
BorderTools.PlacementTarget = btn;
}
internal void AttachFoldIcon(ToolbarImageButton btn) => Fold_Icon = btn; internal void AttachFoldIcon(ToolbarImageButton btn) => Fold_Icon = btn;
internal void InitializeToolbarPlugins() internal void InitializeToolbarPlugins()