| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 | using InABox.Core;using InABox.WPF;using Microsoft.Win32;using Syncfusion.XPS;using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Controls;using System.Windows.Media;using FastReport.DevComponents.DotNetBar;using Microsoft.Xaml.Behaviors.Core;namespace InABox.DynamicGrid{    public class DFVideoControl : DynamicFormFieldControl<DFLayoutVideoField, DFLayoutVideoFieldProperties, byte[], DFLayoutEmbeddedMediaValue>    {        private DFLayoutEmbeddedMediaValue _value = null!;        private Button? _playButton;        private Button? _pauseButton;        private Button? _downloadButton;        private MediaElement _player = null!;        private Border? _border;        private Image? _thumbnail;        private Grid? _contentGrid;        private Grid? _grid;        /*Point center;        int rotation = 90;        bool firstPlay = true;*/        private string _tempfilename = null!;        byte[]? Data;        protected override FrameworkElement Create()        {            _tempfilename = System.IO.Path.ChangeExtension(System.IO.Path.GetTempFileName(),".mp4");                        _value = new DFLayoutEmbeddedMediaValue();            _grid = new Grid();            _grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) });            _grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) });            _grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });            _grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) });            _grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) });            _grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });                            _border = new Border()            {                BorderBrush = new System.Windows.Media.SolidColorBrush(Colors.Gray),                BorderThickness = new Thickness(0.75),                Background = new System.Windows.Media.SolidColorBrush(Colors.White),                Padding = new Thickness(4),                Margin = new Thickness(0)            };            _border.SetGridPosition(0,0,5,1);            _grid.Children.Add(_border);                        _contentGrid = new Grid();            _contentGrid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });            _contentGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) });            _border.Child = _contentGrid;                        _thumbnail = new Image            {                StretchDirection = StretchDirection.DownOnly,                Source = EmbeddedImageUtilities.CreateEmptyImage()            };            _thumbnail.Visibility = Visibility.Visible;            _thumbnail.SetGridPosition(0, 0, 4, 1);            _contentGrid.Children.Add(_thumbnail);                        _player = new MediaElement            {                Stretch = System.Windows.Media.Stretch.Fill,                Visibility = Visibility.Visible,                VerticalAlignment = VerticalAlignment.Center,                HorizontalAlignment = HorizontalAlignment.Center,                LoadedBehavior = MediaState.Manual,                Source = new Uri(_tempfilename)            };            _player.Visibility = Visibility.Collapsed;            _player.MediaOpened += (sender, args) =>            {                _player.Visibility = Visibility.Visible;                _thumbnail.Visibility = Visibility.Collapsed;            };            _player.MediaEnded += (sender, args) =>            {                _player.Visibility = Visibility.Collapsed;                _thumbnail.Visibility = Visibility.Visible;                _player.Close();            };            _player.SetGridPosition(0, 0, 4, 1);            _contentGrid.Children.Add(_player);                        _playButton = new Button            {                Margin = new Thickness(5,0,0,0),                Content = new Image { Source = Wpf.Resources.play_button.AsBitmapImage(24,24) },                Command = new ActionCommand(PlayButton_Click),                Width = 30,                Height = 30            };            _playButton.SetGridPosition(0, 1);            _grid.Children.Add(_playButton);            _pauseButton = new Button            {                Margin = new Thickness(5,5,0,0),                Content = new Image { Source = Wpf.Resources.pause_button.AsBitmapImage(32,32) },                Command = new ActionCommand(PauseButton_Click),                Width = 30,                Height = 30            };            _pauseButton.SetGridPosition(1, 1);            _grid.Children.Add(_pauseButton);                        _downloadButton = new Button            {                Margin = new Thickness(5,5,0,0),                Content = new Image { Source = Wpf.Resources.download.AsBitmapImage(32,32) },                Command = new ActionCommand(DownloadButton_Click),                Width = 30,                Height = 30            };            _downloadButton.SetGridPosition(3, 1);            _grid.Children.Add(_downloadButton);                        return _grid;        }        private void DownloadButton_Click()        {            var dlg = new SaveFileDialog();            dlg.AddExtension = true;            dlg.DefaultExt = ".mp4";            dlg.ShowDialog();            if (!string.IsNullOrWhiteSpace(dlg.FileName))            {                System.IO.File.WriteAllBytes(dlg.FileName, GetValue());                MessageBox.Show("Success - file saved to: "                    + System.Environment.NewLine                    + dlg.FileName);                var dir = System.IO.Path.GetDirectoryName(dlg.FileName);                ProcessStartInfo startInfo = new ProcessStartInfo                {                    Arguments = dir,                    FileName = "explorer.exe"                };                Process.Start(startInfo);            }        }        private void PauseButton_Click()        {            _player.Pause();        }        private void PlayButton_Click()        {              if (System.IO.File.Exists(_tempfilename))            {                _player.Play();            }            else            {                DigitalFormDocumentFactory.LoadDocument(_value.ID, (data) =>                {                    Dispatcher.BeginInvoke(() =>                    {                        System.IO.File.WriteAllBytes(_tempfilename, data);                        _player.Position = new TimeSpan(0);                        _player.Play();                    });                });             }        }        public override DFLayoutEmbeddedMediaValue GetSerializedValue()        {            if ((_value.Data?.Any() == true) && (_value.ID == Guid.Empty))                _value.ID = DigitalFormDocumentFactory.SaveDocument(_value.Data);            return _value;        }        public override void SetSerializedValue(DFLayoutEmbeddedMediaValue value)        {            _value = value;            EmbeddedImageUtilities.LoadImageFromData(_thumbnail, _value.Thumbnail);        }        public override byte[] GetValue()        {            return Data ?? Array.Empty<byte>();        }        public override void SetValue(byte[]? value)        {            Data = value;        }        protected override bool IsEmpty() => Data is null || Data.Length == 0;    }}
 |