diff options
| author | Victoria Plitt <Victoria.Plitt@twine-s.com> | 2020-04-06 08:32:13 +0200 |
|---|---|---|
| committer | Victoria Plitt <Victoria.Plitt@twine-s.com> | 2020-04-06 08:32:13 +0200 |
| commit | ed96ea77cd47adda9373b73201a026b85c03d206 (patch) | |
| tree | 5d2f868170767c9e4316ac4b373d1af71b87df9d /Software/Visual_Studio/Tango.SharedUI/Controls | |
| parent | 44c91de2b71d128d9b47e240ee6f4e58b6b8544e (diff) | |
| download | Tango-ed96ea77cd47adda9373b73201a026b85c03d206.tar.gz Tango-ed96ea77cd47adda9373b73201a026b85c03d206.zip | |
MultiSelectComboBox . Added template selectors. Not completed yet.
Diffstat (limited to 'Software/Visual_Studio/Tango.SharedUI/Controls')
| -rw-r--r-- | Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBox.cs | 289 |
1 files changed, 264 insertions, 25 deletions
diff --git a/Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBox.cs b/Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBox.cs index 66eaa4e14..94f263be7 100644 --- a/Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBox.cs +++ b/Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBox.cs @@ -16,35 +16,126 @@ using System.Windows.Navigation; using System.Windows.Shapes; using Tango.Core.Commands; using System.ComponentModel; +using System.Windows.Controls.Primitives; +using System.Windows.Threading; namespace Tango.SharedUI.Controls { + internal sealed class MultiSelectComboBoxTemplateSelector : DataTemplateSelector + { + public override DataTemplate SelectTemplate(object item, DependencyObject container) + { + FrameworkElement element = container as FrameworkElement; + if (element != null && item != null && item is MultiSelectComboBoxItem) + return element.FindResource("CheckItem") as DataTemplate; + + return element.FindResource("SearchItem") as DataTemplate; ; + + } + } + + interface IMultiSelectComboBoxItem + { + string Text { get; set; } + } + public class MultiSelectComboBoxItem : IMultiSelectComboBoxItem + { + public string Text { get; set; } + public MultiSelectComboBoxItem(string text) + { + Text = text; + } + public override string ToString() + { + return Text; + } + } + public class MultiSelectComboBoxSearchItem : IMultiSelectComboBoxItem + { + public string Text { get; set; } + public MultiSelectComboBoxSearchItem(string text = "") + { + Text = text; + } + public override string ToString() + { + return Text; + } + } + + [TemplatePart(Name = MultiSelectComboBox.PartEditor, Type = typeof(TextBox))] + [TemplatePart(Name = MultiSelectComboBox.PartPopup, Type = typeof(Popup))] public class MultiSelectComboBox : Control { + #region Fields + public const string PartEditor = "Edit_PART"; + public const string PartPopup = "MultiSel_Popup"; + private ItemsControl _items_control; + private bool _isLoaded; + #endregion + #region "Constructors" + static MultiSelectComboBox() { DefaultStyleKeyProperty.OverrideMetadata(typeof(MultiSelectComboBox), new FrameworkPropertyMetadata(typeof(MultiSelectComboBox))); } - public MultiSelectComboBox() : base() { + SelectedItemsList = new ObservableCollection<object>(); RemoveAllCommand = new RelayCommand((() => SelectedItemsList.Clear()), () => SelectedItemsList != null && SelectedItemsList.Count > 0); - RemoveItemCommand = new RelayCommand<string>((item) => SelectedItemsList.Remove(item), () => SelectedItemsList != null); - AddItemCommand = new RelayCommand<string>((item) => SelectedItemsList.Add(item)); - SearchText = ""; + RemoveItemCommand = new RelayCommand<MultiSelectComboBoxItem>((item) => SelectedItemsList.Remove(item), () => SelectedItemsList != null); + AddItemCommand = new RelayCommand<string>((item) => SelectedItemsList.Add(new MultiSelectComboBoxItem(item))); + SearchText = new MultiSelectComboBoxSearchItem(); + Loaded += MultiSelectComboBox_Loaded; + _isLoaded = false; + + } + #endregion #region Properties - public ObservableCollection<string> SelectedItemsList + private TextBox _editor; + + public TextBox Editor { - get { return (ObservableCollection<string>)GetValue(SelectedItemsListProperty); } + get { return _editor; } + set { _editor = value; } + } + + private Popup _popup; + + public Popup Popup + { + get { return _popup; } + set { _popup = value; } + } + + private DispatcherTimer _fetchTimer; + + public DispatcherTimer FetchTimer + { + get { return _fetchTimer; } + set { _fetchTimer = value; } + } + + //private SelectionAdapter _selectionAdapter; + + //public SelectionAdapter SelectionAdapter + //{ + // get { return _selectionAdapter; } + // set { _selectionAdapter = value; } + //} + + public ObservableCollection<object> SelectedItemsList + { + get { return (ObservableCollection<object>)GetValue(SelectedItemsListProperty); } set { SetValue(SelectedItemsListProperty, value); } } public static readonly DependencyProperty SelectedItemsListProperty = - DependencyProperty.Register("SelectedItemsList", typeof(ObservableCollection<string>), typeof(MultiSelectComboBox), new PropertyMetadata(default(ObservableCollection<string>))); + DependencyProperty.Register("SelectedItemsList", typeof(ObservableCollection<object>), typeof(MultiSelectComboBox), new PropertyMetadata(default(ObservableCollection<object>))); public ListCollectionView SearchItemsList @@ -67,23 +158,21 @@ namespace Tango.SharedUI.Controls public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register("Items", typeof(ObservableCollection<string>), typeof(MultiSelectComboBox), new PropertyMetadata(default(ObservableCollection<string>))); - - + public bool IsToggleChecked { get { return (bool)GetValue(IsToggleCheckedProperty); } set { SetValue(IsToggleCheckedProperty, value); } } - public static readonly DependencyProperty IsToggleCheckedProperty = - DependencyProperty.Register("IsToggleChecked", typeof(bool), typeof(MultiSelectComboBox), new PropertyMetadata(false)); - + public static readonly DependencyProperty IsToggleCheckedProperty = + DependencyProperty.Register("IsToggleChecked", typeof(bool), typeof(MultiSelectComboBox), new FrameworkPropertyMetadata(false)); - private string _searchText; + private MultiSelectComboBoxSearchItem _searchText; /// <summary> /// Gets or sets the search text of TextBox. /// </summary> - public string SearchText + public MultiSelectComboBoxSearchItem SearchText { get { return _searchText; } set {_searchText = value; @@ -91,15 +180,47 @@ namespace Tango.SharedUI.Controls OnTextChanged(); } } + #endregion + + private void MultiSelectComboBox_Loaded(object sender, RoutedEventArgs e) + { + if (!_isLoaded) + { + ToggleButton b2 = GetTemplateChild("MultiSelToggleButton") as ToggleButton; + if (b2 != null) + { + // ct.LoadContent(); + _items_control = b2.Template.FindName("SelectedItemsControl", b2) as ItemsControl; + if (_items_control != null) + { + var wrapPanel = _items_control.FindChild<WrapPanel>(); + if (wrapPanel != null) + { + _items_control.Bind(ItemsControl.HeightProperty, wrapPanel, WrapPanel.ActualHeightProperty, BindingMode.OneWay); + _isLoaded = true; + + var searchItem =(_items_control.ItemContainerGenerator.ContainerFromItem(SearchText)); + Editor = searchItem.FindVisualChildren< TextBox>().FirstOrDefault(x => x.Name == PartEditor); + if (Editor != null) + { + Editor.TextChanged += OnEditorTextChanged; + Editor.PreviewKeyDown += OnEditorKeyDown; + Editor.LostFocus += OnEditorLostFocus; + } + } + } + } + } + } void OnTextChanged() { if(SearchItemsList != null) { - if (String.IsNullOrEmpty(SearchText)) + if (String.IsNullOrEmpty(SearchText.Text)) SearchItemsList.Filter = null; else - SearchItemsList.Filter = new Predicate<object>(o => ((string)o == SearchText)); + SearchItemsList.Filter = new Predicate<object>(o => ((string)o == SearchText.Text)); } } /// <summary> @@ -115,10 +236,7 @@ namespace Tango.SharedUI.Controls { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); } - - - #endregion - + /// <summary> /// When overridden in a derived class, is invoked whenever application code or internal processes call <see cref="M:System.Windows.FrameworkElement.ApplyTemplate" />. /// </summary> @@ -126,8 +244,51 @@ namespace Tango.SharedUI.Controls { base.OnApplyTemplate(); if (SelectedItemsList == null) - SelectedItemsList = new ObservableCollection<string>(); + SelectedItemsList = new ObservableCollection<object>(); + SelectedItemsList.Add(SearchText); + + SearchItemsList = new ListCollectionView(this.Items); + + //DataTemplate temp = Template.FindName("SearchItem", this) as DataTemplate; + //Editor = Template.FindName(PartEditor, this) as TextBox; + Popup = Template.FindName(PartPopup, this) as Popup; + //ItemsSelector = Template.FindName(PartSelector, this) as Selector; + //_partSelectedContent = Template.FindName("PART_SelectedContent", this) as ContentControl; + // BindingEvaluator = new BindingEvaluator(new Binding(DisplayMember)); + + if (Editor != null) + { + Editor.TextChanged += OnEditorTextChanged; + Editor.PreviewKeyDown += OnEditorKeyDown; + Editor.LostFocus += OnEditorLostFocus; + Editor.Focus(); + + //if (SelectedItem != null) + //{ + // Editor.Text = BindingEvaluator.Evaluate(SelectedItem); + //} + + } + + this.GotFocus += SelTextBox_GotFocus; + + if (Popup != null) + { + Popup.StaysOpen = false; + Popup.Opened += OnPopupOpened; + Popup.Closed += OnPopupClosed; + } + //if (ItemsSelector != null) + //{ + // SelectionAdapter = new SelectionAdapter(ItemsSelector); + // SelectionAdapter.Commit += OnSelectionAdapterCommit; + // SelectionAdapter.Cancel += OnSelectionAdapterCancel; + // SelectionAdapter.SelectionChanged += OnSelectionAdapterSelectionChanged; + // ItemsSelector.PreviewMouseDown += ItemsSelector_PreviewMouseDown; + //} + + //_isUpdatingText = false; //ItemsControl iControl = FindName("asd") as ItemsControl; //iControl.ItemContainerGenerator.ItemsChanged += ItemContainerGenerator_ItemsChanged; @@ -139,10 +300,89 @@ namespace Tango.SharedUI.Controls //} } + private void OnEditorTextChanged(object sender, TextChangedEventArgs e) + { + if (FetchTimer == null) + { + FetchTimer = new DispatcherTimer(); + FetchTimer.Interval = TimeSpan.FromMilliseconds(500); + FetchTimer.Tick += OnFetchTimerTick; + } + FetchTimer.IsEnabled = false; + FetchTimer.Stop(); + // SetSelectedItem(null); + if (Editor.Text.Length > 0) + { + // IsLoading = true; + IsToggleChecked = true; + // ItemsSelector.ItemsSource = null; + FetchTimer.IsEnabled = true; + FetchTimer.Start(); + } + else + { + IsToggleChecked = false; + } + } + + private void OnFetchTimerTick(object sender, EventArgs e) + { + FetchTimer.IsEnabled = false; + FetchTimer.Stop(); + } + + private void OnEditorKeyDown(object sender, KeyEventArgs e) + { + //if (SelectionAdapter != null) + { + if (IsToggleChecked) + { + // SelectionAdapter.HandleKeyDown(e); + } + else + IsToggleChecked = e.Key == Key.Down || e.Key == Key.Up; + } + } + + private void OnEditorLostFocus(object sender, RoutedEventArgs e) + { + if (!IsKeyboardFocusWithin) + { + IsToggleChecked = false; + } + } + + private void SelTextBox_GotFocus(object sender, RoutedEventArgs e) + { + Editor?.Focus(); + } + + private void OnPopupOpened(object sender, EventArgs e) + { + //ItemsSelector.SelectedItem = SelectedItem; + } + private void OnPopupClosed(object sender, EventArgs e) + { + OnSelectionAdapterCommit(); + + } private void ItemContainerGenerator_ItemsChanged(object sender, System.Windows.Controls.Primitives.ItemsChangedEventArgs e) { } + private void OnSelectionAdapterCommit() + { + IsToggleChecked = false; + // if (ItemsSelector.SelectedItem != null) + // { + // SelectedItem = ItemsSelector.SelectedItem; + // _isUpdatingText = true; + // Editor.Text = GetDisplayText(ItemsSelector.SelectedItem); + // SetSelectedItem(ItemsSelector.SelectedItem); + // _isUpdatingText = false; + // IsDropDownOpen = false; + // } + } #region Commands /// <summary> @@ -158,10 +398,10 @@ namespace Tango.SharedUI.Controls /// <summary> /// The remove item from SelectedItemsList command property /// </summary> - public static DependencyProperty RemoveItemCommandProperty = DependencyProperty.Register("RemoveItemCommand", typeof(RelayCommand<string>), typeof(MultiSelectComboBox)); - public RelayCommand<string> RemoveItemCommand + public static DependencyProperty RemoveItemCommandProperty = DependencyProperty.Register("RemoveItemCommand", typeof(RelayCommand<MultiSelectComboBoxItem>), typeof(MultiSelectComboBox)); + public RelayCommand<MultiSelectComboBoxItem> RemoveItemCommand { - get { return (RelayCommand<string>)GetValue(RemoveItemCommandProperty); } + get { return (RelayCommand<MultiSelectComboBoxItem>)GetValue(RemoveItemCommandProperty); } private set { SetValue(RemoveItemCommandProperty, value); } } @@ -174,7 +414,6 @@ namespace Tango.SharedUI.Controls } #endregion - } } |
