Add a copy button to the image viewer #1399

This commit is contained in:
ema
2024-12-12 11:43:26 +08:00
parent 9f3014c20c
commit d09e9c48d8
2 changed files with 63 additions and 19 deletions

View File

@@ -91,25 +91,34 @@
</Border.Resources> </Border.Resources>
</Border> </Border>
<Button x:Name="buttonMeta" <StackPanel Margin="0,8,0,0"
Width="24" HorizontalAlignment="Right"
Height="24" VerticalAlignment="Top"
Margin="0,8,40,0" Orientation="Horizontal">
HorizontalAlignment="Right" <Button x:Name="buttonCopy"
VerticalAlignment="Top" Width="24"
Content="&#xE946;" Height="24"
Style="{StaticResource CaptionButtonStyle}" Margin="0,0,8,0"
Visibility="{Binding ElementName=imagePanel, Path=MetaIconVisibility}" /> Content="&#xE8C8;"
Style="{StaticResource CaptionButtonStyle}"
Visibility="{Binding ElementName=imagePanel, Path=CopyIconVisibility}" />
<Button x:Name="buttonBackgroundColour" <Button x:Name="buttonMeta"
Width="24" Width="24"
Height="24" Height="24"
Margin="0,8,8,0" Margin="0,0,8,0"
HorizontalAlignment="Right" Content="&#xE946;"
VerticalAlignment="Top" Style="{StaticResource CaptionButtonStyle}"
Content="&#xEF1F;" Visibility="{Binding ElementName=imagePanel, Path=MetaIconVisibility}" />
Style="{StaticResource CaptionButtonStyle}"
Visibility="{Binding ElementName=imagePanel, Path=BackgroundVisibility}" /> <Button x:Name="buttonBackgroundColour"
Width="24"
Height="24"
Margin="0,0,8,0"
Content="&#xEF1F;"
Style="{StaticResource CaptionButtonStyle}"
Visibility="{Binding ElementName=imagePanel, Path=BackgroundVisibility}" />
</StackPanel>
<TextBlock x:Name="textMeta" <TextBlock x:Name="textMeta"
Margin="0,40,8,0" Margin="0,40,8,0"

View File

@@ -49,6 +49,7 @@ public partial class ImagePanel : UserControl, INotifyPropertyChanged, IDisposab
private bool _isZoomFactorFirstSet = true; private bool _isZoomFactorFirstSet = true;
private DateTime _lastZoomTime = DateTime.MinValue; private DateTime _lastZoomTime = DateTime.MinValue;
private double _maxZoomFactor = 3d; private double _maxZoomFactor = 3d;
private Visibility _copyIconVisibility = Visibility.Visible;
private MetaProvider _meta; private MetaProvider _meta;
private Visibility _metaIconVisibility = Visibility.Visible; private Visibility _metaIconVisibility = Visibility.Visible;
private double _minZoomFactor = 0.1d; private double _minZoomFactor = 0.1d;
@@ -67,6 +68,8 @@ public partial class ImagePanel : UserControl, INotifyPropertyChanged, IDisposab
Resources.MergedDictionaries.Clear(); Resources.MergedDictionaries.Clear();
buttonCopy.Click += OnCopyOnClick;
buttonMeta.Click += (sender, e) => buttonMeta.Click += (sender, e) =>
textMeta.Visibility = textMeta.Visibility == Visibility.Collapsed textMeta.Visibility = textMeta.Visibility == Visibility.Collapsed
? Visibility.Visible ? Visibility.Visible
@@ -162,6 +165,16 @@ public partial class ImagePanel : UserControl, INotifyPropertyChanged, IDisposab
} }
} }
public Visibility CopyIconVisibility
{
get => _copyIconVisibility;
set
{
_copyIconVisibility = value;
OnPropertyChanged();
}
}
public Visibility BackgroundVisibility public Visibility BackgroundVisibility
{ {
get => _backgroundVisibility; get => _backgroundVisibility;
@@ -274,6 +287,28 @@ public partial class ImagePanel : UserControl, INotifyPropertyChanged, IDisposab
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;
private void OnCopyOnClick(object sender, RoutedEventArgs e)
{
try
{
if (_source is not null)
{
Clipboard.SetImage(_source);
return;
}
if (viewPanelImage.Source is BitmapSource bitmapSource)
{
Clipboard.SetImage(bitmapSource);
return;
}
}
catch
{
///
}
}
private void OnBackgroundColourOnClick(object sender, RoutedEventArgs e) private void OnBackgroundColourOnClick(object sender, RoutedEventArgs e)
{ {
Theme = Theme == Themes.Dark ? Themes.Light : Themes.Dark; Theme = Theme == Themes.Dark ? Themes.Light : Themes.Dark;
@@ -499,7 +534,7 @@ public partial class ImagePanel : UserControl, INotifyPropertyChanged, IDisposab
Debug.WriteLine($"FireZoomChangedEvent fired: {Thread.CurrentThread.ManagedThreadId}"); Debug.WriteLine($"FireZoomChangedEvent fired: {Thread.CurrentThread.ManagedThreadId}");
Dispatcher.BeginInvoke(new Action(() => ZoomChanged?.Invoke(this, new EventArgs())), Dispatcher.BeginInvoke(new Action(() => ZoomChanged?.Invoke(this, EventArgs.Empty)),
DispatcherPriority.Background); DispatcherPriority.Background);
}); });
} }