diff options
| author | Shlomo Hecht <shlomo@twine-s.com> | 2018-07-08 09:45:46 +0300 |
|---|---|---|
| committer | Shlomo Hecht <shlomo@twine-s.com> | 2018-07-08 09:45:46 +0300 |
| commit | a2cf6c8d62083a63ee193a1cd206ab345368b242 (patch) | |
| tree | 4f653018e4fb5b4ad806e9d410800489afe411e5 /Software/Visual_Studio/PPC/Tango.PPC.Common/Controls | |
| parent | c8807df7010acb129997cb7ca130e6b7928ce809 (diff) | |
| parent | f4688d6113dc33deac114bd6999967fec246b8c0 (diff) | |
| download | Tango-a2cf6c8d62083a63ee193a1cd206ab345368b242.tar.gz Tango-a2cf6c8d62083a63ee193a1cd206ab345368b242.zip | |
Merge branch 'master' of https://twinetfs.visualstudio.com/Tango/_git/Tango
Diffstat (limited to 'Software/Visual_Studio/PPC/Tango.PPC.Common/Controls')
3 files changed, 230 insertions, 7 deletions
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(); + }); + } + } + } +} diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml b/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml index 66db7bc10..baf971430 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml @@ -16,11 +16,11 @@ <ColumnDefinition Width="100"/> </Grid.ColumnDefinitions> - <touch:TouchListBox ItemsSource="{Binding Groups}" x:Name="list" DisableRipple="True" ScrollBarVisibility="Collapsed" SelectionMode="None"> + <touch:TouchListBox ItemsSource="{Binding Groups}" x:Name="list" x:FieldModifier="public" DisableRipple="True" ScrollBarVisibility="Collapsed" SelectionMode="None"> <touch:TouchListBox.ItemTemplate> <DataTemplate> <StackPanel Margin="0 0 10 0"> - <TextBlock HorizontalAlignment="Center" Text="{Binding Name}"></TextBlock> + <TextBlock HorizontalAlignment="Center" Text="{Binding Name}" FontSize="{StaticResource TangoTitleFontSize}"></TextBlock> <touch:TouchStaticListBox ItemsSource="{Binding Items}" SelectedItem="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=SelectedItem,Mode=TwoWay}" Margin="0 20 0 40"> <touch:TouchStaticListBox.ItemsPanel> <ItemsPanelTemplate> diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml.cs index 024f47f58..f2a90a454 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml.cs @@ -13,6 +13,7 @@ using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Tango.BL.Catalogs; +using Tango.Touch.Controls; namespace Tango.PPC.Common.Controls { @@ -39,14 +40,25 @@ namespace Tango.PPC.Common.Controls InitializeComponent(); Loaded += TwineCatalogControl_Loaded; - DataContextChanged += (x, y) => { _catalog = DataContext as Catalog; }; + DataContextChanged += (x, y) => + { + _catalog = DataContext as Catalog; + + if (list.ScrollViewer != null && _catalog != null) + { + list.ScrollViewer.ScrollToTop(); + _preventChange = true; + slider.Value = _catalog.Groups.Count; + _preventChange = false; + } + }; } private void ScrollViewer_Scrolling(object sender, Touch.Controls.DoubleValueChangedEventArgs e) { if (!_preventChange) { - if (e.Value > _lastScrollPosition + 10 || e.Value < _lastScrollPosition - 10) + if (e.Value > _lastScrollPosition + 60 || e.Value < _lastScrollPosition - 60) { var group = list.ScrollViewer.GetMostVisibleElementDataContext<CatalogGroup>(); @@ -56,9 +68,9 @@ namespace Tango.PPC.Common.Controls slider.Value = slider.Maximum - _catalog.Groups.IndexOf(group); _preventChange = false; } - } - _lastScrollPosition = e.Value; + _lastScrollPosition = e.Value; + } } } @@ -89,7 +101,7 @@ namespace Tango.PPC.Common.Controls } } - if (_catalog != null) + if (_catalog != null && _catalog.Groups.Count > _catalog.Groups.Count - 1 - (int)e.NewValue && _catalog.Groups.Count - 1 - (int)e.NewValue > -1) { slider.Foreground = new SolidColorBrush(_catalog.Groups.ElementAt(_catalog.Groups.Count - 1 - (int)e.NewValue).Color); } @@ -106,5 +118,11 @@ namespace Tango.PPC.Common.Controls _preventChange = false; } } + + public TouchListBox TouchListBox + { + get { return list; } + } + } } |
