From 4ca8cee91fb46977b75e8329c18d9b6a4654b12e Mon Sep 17 00:00:00 2001 From: Roy Ben Shabat Date: Sat, 7 Jul 2018 15:02:20 +0300 Subject: Working on PPC jobs loading performance... --- .../Controls/AsyncAdornerControl.cs | 205 +++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/AsyncAdornerControl.cs (limited to 'Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/AsyncAdornerControl.cs') diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/AsyncAdornerControl.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/AsyncAdornerControl.cs new file mode 100644 index 000000000..b20e93ff9 --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/AsyncAdornerControl.cs @@ -0,0 +1,205 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Interop; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using Tango.Core.Components; + +namespace Tango.PPC.Common.Controls +{ + public partial class AsyncAdornerControl : ContentControl + { + private bool _loaded; + + public enum GWL + { + ExStyle = -20 + } + + public enum WS_EX + { + Transparent = 0x20, + Layered = 0x80000 + } + + public enum LWA + { + ColorKey = 0x1, + Alpha = 0x2 + } + + [DllImport("user32.dll", EntryPoint = "GetWindowLong")] + public static extern int GetWindowLong(IntPtr hWnd, GWL nIndex); + + [DllImport("user32.dll", EntryPoint = "SetWindowLong")] + public static extern int SetWindowLong(IntPtr hWnd, GWL nIndex, int dwNewLong); + + [DllImport("user32.dll", EntryPoint = "SetLayeredWindowAttributes")] + public static extern bool SetLayeredWindowAttributes(IntPtr hWnd, int crKey, byte alpha, LWA dwFlags); + + private Window _window; + + public AsyncAdornerControl() + { + Loaded += AsyncAdornerControl_Loaded; + LayoutUpdated += AsyncAdornerControl_LayoutUpdated; + IsVisibleChanged += AsyncAdornerControl_IsVisibleChanged; + } + + private void AsyncAdornerControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) + { + if (Visibility == Visibility.Visible) + { + ShowWindow(); + } + else + { + HideWindow(); + } + } + + private void AsyncAdornerControl_LayoutUpdated(object sender, EventArgs e) + { + SyncBounds(); + } + + public Type ViewType + { + get { return (Type)GetValue(ViewTypeProperty); } + set { SetValue(ViewTypeProperty, value); } + } + public static readonly DependencyProperty ViewTypeProperty = + DependencyProperty.Register("ViewType", typeof(Type), typeof(AsyncAdornerControl), new PropertyMetadata(null)); + + protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo) + { + base.OnRenderSizeChanged(sizeInfo); + SyncBounds(); + } + + private void AsyncAdornerControl_Loaded(object sender, RoutedEventArgs e) + { + if (!this.IsInDesignMode()) + { + if (_loaded) return; + + _loaded = true; + + var handle = new WindowInteropHelper(System.Windows.Application.Current.MainWindow).Handle; + + System.Windows.Application.Current.MainWindow.LocationChanged += MainWindow_LocationChanged; + + Visibility v = Visibility; + Type type = ViewType; + + var xaml = FrameworkElementSerializer.Serialize(Content as FrameworkElement); + object dc = this.DataContext; + Content = null; + + Thread thread = new Thread(() => + { + _window = new Window(); + _window.WindowStyle = WindowStyle.None; + _window.ResizeMode = ResizeMode.NoResize; + _window.ShowInTaskbar = false; + _window.AllowsTransparency = true; + _window.Background = Brushes.Transparent; + _window.WindowStartupLocation = WindowStartupLocation.Manual; + SyncBounds(); + + if (v != Visibility.Visible) + { + _window.Opacity = 0; + } + + new WindowInteropHelper(_window).Owner = handle; + + _window.ShowActivated = false; + + //FrameworkElement element = Activator.CreateInstance(type) as FrameworkElement; + + var cloned = FrameworkElementSerializer.Deserialize(xaml); + cloned.DataContext = dc; + + _window.Content = cloned; + + _window.Show(); + + int wl = GetWindowLong(handle, GWL.ExStyle); + wl = wl | 0x80000 | 0x20; + SetWindowLong(handle, GWL.ExStyle, wl); + SetLayeredWindowAttributes(handle, 0, 128, LWA.Alpha); + + SyncBounds(); + + System.Windows.Threading.Dispatcher.Run(); + }); + + thread.SetApartmentState(ApartmentState.STA); + thread.IsBackground = true; + thread.Start(); + } + } + + private void MainWindow_LocationChanged(object sender, EventArgs e) + { + SyncBounds(); + } + + private void SyncBounds() + { + if (_window != null) + { + this.BeginInvoke(() => + { + Point location = PointToScreen(new Point(0, 0)); + Size size = new Size(ActualWidth, ActualHeight); + + _window.BeginInvoke(() => + { + _window.Top = location.Y; + _window.Left = location.X; + _window.Width = size.Width; + _window.Height = size.Height; + }); + }); + } + } + + private void HideWindow() + { + if (_window != null) + { + _window.BeginInvoke(() => + { + _window.Hide(); + }); + } + } + + private void ShowWindow() + { + if (_window != null) + { + _window.BeginInvoke(() => + { + _window.Opacity = 1; + _window.Show(); + }); + } + } + } +} -- cgit v1.3.1