新增图片选择选项

This commit is contained in:
PrefacedCorg
2025-07-31 13:23:33 +08:00
parent 71b2e56187
commit 5fdbf83f32
4 changed files with 269 additions and 14 deletions
+73 -12
View File
@@ -3159,33 +3159,94 @@
HorizontalAlignment="Left" VerticalAlignment="Top" Margin="800,900,0,0"
CornerRadius="5" Height="80"
Background="{DynamicResource FloatBarBackground}"
Visibility="Collapsed"
Visibility="{Binding ElementName=GridInkCanvasSelectionCover, Path=Visibility}"
BorderThickness="1" BorderBrush="{DynamicResource FloatBarBorderBrush}">
<Viewbox Margin="0,-2.5">
<ui:SimpleStackPanel Orientation="Horizontal" Spacing="10" Height="60">
<Border Name="BorderImageRotateLeft" Margin="0,2,-9,2" Background="Transparent"
<Border Name="BorderImageClone" Margin="0,2,-9,2" Background="Transparent"
CornerRadius="{Binding ElementName=BorderImageSelectionControl, Path=CornerRadius}"
Width="40" MouseDown="Border_MouseDown" MouseUp="BorderImageRotateLeft_MouseUp">
Width="40" MouseDown="Border_MouseDown" MouseUp="BorderImageClone_MouseUp">
<ui:SimpleStackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
<Image Source="/Resources/Icons-Fluent/ic_fluent_flip_horizontal_24_regular.png"
<Image Source="/Resources/Icons-Fluent/ic_fluent_copy_24_regular.png"
RenderOptions.BitmapScalingMode="HighQuality" Height="25" Width="25" />
<TextBlock Text="左转" FontSize="10" Foreground="{DynamicResource FloatBarForeground}"
<TextBlock Text="克隆" FontSize="10" Foreground="{DynamicResource FloatBarForeground}"
HorizontalAlignment="Center" />
</ui:SimpleStackPanel>
</Border>
<Border Name="BorderImageRotateRight" Margin="0,2,-9,2" Background="Transparent"
<Border Name="BorderImageCloneToNewBoard"
Margin="0,2,-9,2"
Background="Transparent"
CornerRadius="{Binding ElementName=BorderImageSelectionControl, Path=CornerRadius}"
Width="40" MouseDown="Border_MouseDown" MouseUp="BorderImageRotateRight_MouseUp">
<ui:SimpleStackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
<Image Source="/Resources/Icons-Fluent/ic_fluent_flip_vertical_24_regular.png"
RenderOptions.BitmapScalingMode="HighQuality" Height="25" Width="25" />
<TextBlock Text="右转" FontSize="10" Foreground="{DynamicResource FloatBarForeground}"
Width="40"
MouseDown="Border_MouseDown"
MouseUp="BorderImageCloneToNewBoard_MouseUp"
Visibility="{Binding Visibility, ElementName=GridBackgroundCover}">
<ui:SimpleStackPanel VerticalAlignment="Center"
HorizontalAlignment="Center">
<Image Source="/Resources/Icons-Fluent/ic_fluent_copy_add_24_regular.png"
RenderOptions.BitmapScalingMode="HighQuality"
Height="25"
Width="25" />
<TextBlock Text="克隆至新页"
FontSize="8"
Foreground="{DynamicResource FloatBarForeground}"
HorizontalAlignment="Center" />
</ui:SimpleStackPanel>
</Border>
<Border Width="1"
Height="45"
BorderBrush="{DynamicResource FloatBarForeground}"
Background="{DynamicResource FloatBarForeground}" />
<Border CornerRadius="{Binding ElementName=BorderImageSelectionControl, Path=CornerRadius}"
Height="40">
<ui:SimpleStackPanel VerticalAlignment="Center"
Spacing="5"
Margin="0,-10">
<ui:SimpleStackPanel Orientation="Horizontal"
Spacing="10">
<Image Source="{DynamicResource Rotate45DrawingImage}"
Height="22"
MouseDown="Border_MouseDown"
MouseUp="BorderImageRotateLeft_MouseUp" />
<Image Source="{DynamicResource Rotate90DrawingImage}"
Height="22"
MouseDown="Border_MouseDown"
MouseUp="BorderImageRotateRight_MouseUp" />
</ui:SimpleStackPanel>
<TextBlock Text="旋转"
FontSize="10"
HorizontalAlignment="Center"
Foreground="{DynamicResource FloatBarForeground}" />
</ui:SimpleStackPanel>
</Border>
<Border Width="1" Height="45" BorderBrush="{DynamicResource FloatBarForeground}"
Background="{DynamicResource FloatBarForeground}" />
<Border Name="BorderImageDelete" Margin="-8,0,0,0"
<Border CornerRadius="{Binding ElementName=BorderImageSelectionControl, Path=CornerRadius}"
Height="40">
<ui:SimpleStackPanel VerticalAlignment="Center" Spacing="5" Margin="0,-10">
<ui:SimpleStackPanel Orientation="Horizontal" Spacing="10">
<Grid MouseDown="Border_MouseDown" MouseUp="GridImageScaleDecrease_MouseUp">
<Image Source="/Resources/Icons-Fluent/ic_fluent_scale_fit_24_regular.png"
RenderOptions.BitmapScalingMode="HighQuality" Height="25" Width="25" />
<TextBlock Text="-" Foreground="{DynamicResource FloatBarForeground}"
VerticalAlignment="Bottom" HorizontalAlignment="Right"
Margin="0,0,-2,-7" FontSize="15" />
</Grid>
<Grid MouseDown="Border_MouseDown" MouseUp="GridImageScaleIncrease_MouseUp">
<Image Source="/Resources/Icons-Fluent/ic_fluent_scale_fit_24_regular.png"
RenderOptions.BitmapScalingMode="HighQuality" Height="25" Width="25" />
<TextBlock Text="+" Foreground="{DynamicResource FloatBarForeground}"
VerticalAlignment="Bottom" HorizontalAlignment="Right"
Margin="0,0,-3,-4" FontSize="11" />
</Grid>
</ui:SimpleStackPanel>
<TextBlock Text="缩放" FontSize="10" HorizontalAlignment="Center"
Foreground="{DynamicResource FloatBarForeground}" />
</ui:SimpleStackPanel>
</Border>
<Border Width="1" Height="45" BorderBrush="{DynamicResource FloatBarForeground}"
Background="{DynamicResource FloatBarForeground}" />
<Border Margin="-8,0,0,0"
CornerRadius="{Binding ElementName=BorderImageSelectionControl, Path=CornerRadius}"
Width="40" MouseDown="Border_MouseDown" MouseUp="BorderImageDelete_MouseUp">
<ui:SimpleStackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
+46
View File
@@ -1521,8 +1521,30 @@ namespace Ink_Canvas {
#region Image Toolbar Event Handlers
private void BorderImageClone_MouseUp(object sender, MouseButtonEventArgs e)
{
if (lastBorderMouseDownObject != sender) return;
if (selectedUIElement is Image image)
{
CloneImage(image);
}
}
private void BorderImageCloneToNewBoard_MouseUp(object sender, MouseButtonEventArgs e)
{
if (lastBorderMouseDownObject != sender) return;
if (selectedUIElement is Image image)
{
CloneImageToNewBoard(image);
}
}
private void BorderImageRotateLeft_MouseUp(object sender, MouseButtonEventArgs e)
{
if (lastBorderMouseDownObject != sender) return;
if (selectedUIElement is Image image)
{
RotateImage(image, -90);
@@ -1531,14 +1553,38 @@ namespace Ink_Canvas {
private void BorderImageRotateRight_MouseUp(object sender, MouseButtonEventArgs e)
{
if (lastBorderMouseDownObject != sender) return;
if (selectedUIElement is Image image)
{
RotateImage(image, 90);
}
}
private void GridImageScaleIncrease_MouseUp(object sender, MouseButtonEventArgs e)
{
if (lastBorderMouseDownObject != sender) return;
if (selectedUIElement is Image image)
{
ScaleImage(image, 1.25); // 放大5%
}
}
private void GridImageScaleDecrease_MouseUp(object sender, MouseButtonEventArgs e)
{
if (lastBorderMouseDownObject != sender) return;
if (selectedUIElement is Image image)
{
ScaleImage(image, 0.8); // 缩小5%
}
}
private void BorderImageDelete_MouseUp(object sender, MouseButtonEventArgs e)
{
if (lastBorderMouseDownObject != sender) return;
if (selectedUIElement is Image image)
{
DeleteImage(image);
@@ -3,6 +3,7 @@ using System.IO;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Ink_Canvas.Helpers;
@@ -219,6 +220,152 @@ namespace Ink_Canvas
}
}
/// <summary>
/// 克隆图片
/// </summary>
/// <param name="image">要克隆的图片</param>
private void CloneImage(Image image)
{
if (image == null) return;
try
{
// 创建图片的副本
var clonedImage = new Image
{
Source = image.Source,
Width = image.Width,
Height = image.Height,
Stretch = image.Stretch,
RenderTransform = image.RenderTransform?.Clone() as Transform
};
// 设置位置,稍微偏移以避免重叠
InkCanvas.SetLeft(clonedImage, InkCanvas.GetLeft(image) + 20);
InkCanvas.SetTop(clonedImage, InkCanvas.GetTop(image) + 20);
// 添加鼠标事件处理,使图片可以被选择
clonedImage.MouseDown += UIElement_MouseDown;
clonedImage.IsManipulationEnabled = true;
// 添加到画布
inkCanvas.Children.Add(clonedImage);
// 选择新克隆的图片
DeselectUIElement();
SelectUIElement(clonedImage);
// 提交到时间机器以支持撤销
timeMachine.CommitElementInsertHistory(clonedImage);
}
catch (Exception ex)
{
// 记录错误但不中断程序
System.Diagnostics.Debug.WriteLine($"克隆图片时发生错误: {ex.Message}");
}
}
/// <summary>
/// 克隆图片到新页面
/// </summary>
/// <param name="image">要克隆的图片</param>
private void CloneImageToNewBoard(Image image)
{
if (image == null) return;
try
{
// 创建图片的副本
var clonedImage = new Image
{
Source = image.Source,
Width = image.Width,
Height = image.Height,
Stretch = image.Stretch,
RenderTransform = image.RenderTransform?.Clone() as Transform
};
// 设置位置,稍微偏移以避免重叠
InkCanvas.SetLeft(clonedImage, InkCanvas.GetLeft(image) + 20);
InkCanvas.SetTop(clonedImage, InkCanvas.GetTop(image) + 20);
// 添加鼠标事件处理,使图片可以被选择
clonedImage.MouseDown += UIElement_MouseDown;
clonedImage.IsManipulationEnabled = true;
// 创建新页面
BtnWhiteBoardAdd_Click(null, null);
// 添加到新页面的画布
inkCanvas.Children.Add(clonedImage);
// 选择新克隆的图片
DeselectUIElement();
SelectUIElement(clonedImage);
// 提交到时间机器以支持撤销
timeMachine.CommitElementInsertHistory(clonedImage);
}
catch (Exception ex)
{
// 记录错误但不中断程序
System.Diagnostics.Debug.WriteLine($"克隆图片到新页面时发生错误: {ex.Message}");
}
}
/// <summary>
/// 缩放图片
/// </summary>
/// <param name="image">要缩放的图片</param>
/// <param name="scaleFactor">缩放因子(大于1为放大,小于1为缩小)</param>
private void ScaleImage(Image image, double scaleFactor)
{
if (image == null) return;
try
{
// 获取当前的变换
var transformGroup = image.RenderTransform as TransformGroup ?? new TransformGroup();
// 查找现有的缩放变换
ScaleTransform scaleTransform = null;
foreach (Transform transform in transformGroup.Children)
{
if (transform is ScaleTransform st)
{
scaleTransform = st;
break;
}
}
// 如果没有缩放变换,创建一个新的
if (scaleTransform == null)
{
scaleTransform = new ScaleTransform();
transformGroup.Children.Add(scaleTransform);
}
// 设置缩放中心为图片中心
scaleTransform.CenterX = image.ActualWidth / 2;
scaleTransform.CenterY = image.ActualHeight / 2;
// 应用缩放因子
scaleTransform.ScaleX *= scaleFactor;
scaleTransform.ScaleY *= scaleFactor;
// 应用变换
image.RenderTransform = transformGroup;
// 提交到时间机器以支持撤销
// 注意:缩放操作目前不支持撤销,因为需要更复杂的历史记录机制
}
catch (Exception ex)
{
// 记录错误但不中断程序
System.Diagnostics.Debug.WriteLine($"缩放图片时发生错误: {ex.Message}");
}
}
/// <summary>
/// 删除图片
/// </summary>
@@ -166,6 +166,7 @@ namespace Ink_Canvas {
}
}
// ... existing code ...
private void ImageRotate45_MouseUp(object sender, MouseButtonEventArgs e) {
if (lastBorderMouseDownObject != sender) return;
@@ -179,7 +180,7 @@ namespace Ink_Canvas {
center = m.Transform(center); // 转换为矩阵缩放和旋转的中心点
// Update matrix to reflect translation/rotation
m.RotateAt(45, center.X, center.Y); // 旋转
m.RotateAt(45, center.X, center.Y); // 顺时针旋转45度
var targetStrokes = inkCanvas.GetSelectedStrokes();
foreach (var stroke in targetStrokes) stroke.Transform(m, false);
@@ -471,7 +472,7 @@ namespace Ink_Canvas {
// 图片工具栏相关
private Border borderImageSelectionControl;
private double BorderImageSelectionControlWidth = 150.0; // 3个按钮 + 分隔线的实际宽度
private double BorderImageSelectionControlWidth = 490.0; // 6个按钮 + 分隔线的实际宽度
private double BorderImageSelectionControlHeight = 80.0;
// 元素变化监听相关