I want save all UserControl as image, at the same time, I need to show a animation in order to make the UI better for users.
This is MainWindow:
<Window x:Class="WPF.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:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:local="clr-namespace:FluidV.Components" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:vw="http://inosoft.com/visiwin7" d:DesignHeight="100" d:DesignWidth="1024" mc:Ignorable="d"><Grid x:Name="LayoutRoot"><Button Margin="10" Click="Button1_click"/></Grid></Window>
This is UserControl:
<UserControl x:Class="WPF.AnimationView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" Opacity="0.6" Background="#A8007499" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"><Grid><DataGrid Name="dataGrid1" Width="441" Height="99" Margin="40,70,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" AutoGenerateColumns="False" /><Canvas Name="loading" Width="120" Height="120" Margin="187,76,241,85" HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5"><Ellipse Canvas.Left="55" Canvas.Top="31" Width="15" Height="15" Fill="#FFD1D1F7" Opacity="1.0" Stretch="Fill" /><Ellipse Canvas.Left="38" Canvas.Top="39" Width="15" Height="15" Fill="Blue" Opacity="0.8" Stretch="Fill" /><Ellipse Canvas.Left="36" Canvas.Top="58" Width="15" Height="15" Fill="#FF0000FE" Opacity="0.7" Stretch="Fill" /><Ellipse Canvas.Left="52" Canvas.Top="67" Width="15" Height="15" Fill="Blue" Opacity="0.6" Stretch="Fill" /><Ellipse Canvas.Left="68" Canvas.Top="61" Width="15" Height="15" Fill="#FF2E2EFF" Opacity="0.5" Stretch="Fill" /><Ellipse Canvas.Left="69" Canvas.Top="42" Width="15" Height="15" Fill="#FF6F6FFF" Opacity="0.4" Stretch="Fill" /><Canvas.RenderTransform><RotateTransform x:Name="SpinnerRotate" Angle="0" /></Canvas.RenderTransform><Canvas.Triggers><EventTrigger RoutedEvent="ContentControl.Loaded"><BeginStoryboard><Storyboard><DoubleAnimation Duration="0:0:0.8" From="0" RepeatBehavior="Forever" Storyboard.TargetName="SpinnerRotate" Storyboard.TargetProperty="(RotateTransform.Angle)" To="360" /></Storyboard></BeginStoryboard></EventTrigger></Canvas.Triggers></Canvas></Grid></UserControl>
This is MainWindow.xaml.cs:
private void Button1_click(object sender, RoutedEventArgs e) { Thread t = new Thread(new ThreadStart(() => { Dispatcher.BeginInvoke(new Action(() => { AnimationView w = new AnimationView(); w.Show(); })); })); t.Start(); foreach (UserControl UC in UserControl) { String fileName = UC.Name; String filePath = "D:\ScreenShot"; SaveView(view, fileName, filePath); } } public static void SaveView(UserControl view, string fileName, string destFolder) { Rect bounds = VisualTreeHelper.GetDescendantBounds(view); int width = (int)view.RenderSize.Width; int height = (int)view.RenderSize.Height; if (width == 0 || height == 0) { width = 1920; height = 1080; } RenderTargetBitmap rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32); DrawingVisual dv = new DrawingVisual(); using (DrawingContext ctx = dv.RenderOpen()) { Size size = new Size(500, 500); if (bounds.Size.IsEmpty == false) { if (bounds.Size.Height > 100) { size = new Size(bounds.Size.Width, bounds.Size.Height - 100); } else size = new Size(bounds.Size.Width, bounds.Size.Height); } VisualBrush vb = new VisualBrush(view); ctx.DrawRectangle(vb, new Pen(Brushes.Blue, 2), new Rect(new Point(0, 100), size)); ctx.DrawText(text, new Point(0, 20)); ctx.Close(); } // rtb.Render(view); rtb.Render(dv); try { PngBitmapEncoder jpgEncoder = new PngBitmapEncoder(); jpgEncoder.Frames.Add(BitmapFrame.Create(rtb)); Byte[] _imageArray; using (MemoryStream outputStream = new MemoryStream()) { jpgEncoder.Save(outputStream); _imageArray = outputStream.ToArray(); } //Try Find Save Path, if doesn't exists, create it. if (Directory.Exists(destFolder) == false) Directory.CreateDirectory(destFolder); FileStream fileStream = new FileStream(Path.Combine(destFolder, fileName), FileMode.Create, FileAccess.ReadWrite); fileStream.Write(_imageArray, 0, _imageArray.Length); jpgEncoder.Save(fileStream); fileStream.Close(); } catch (Exception e) { Log4Net.Instance.Info(System.Reflection.MethodInfo.GetCurrentMethod().ToString()); Log4Net.Instance.Info("Exception Generate Screenshot: " + fileName); Log4Net.Instance.Info(e.StackTrace.ToString()); Debug.WriteLine(e.ToString()); } }), DispatcherPriority.Loaded); }
I hope I can get your help.
Many thanks in advance.