상속: System.Windows.Controls.ContentControl
예제 #1
0
        /// <summary>
        /// Triggers the visual state changes and visual transitions
        /// to close the list out of selection mode.
        /// </summary>
        private void CloseSelection()
        {
            IList <WeakReference> items = ItemsControlExtensions.GetItemsInViewPort(this);

            //Only animate the containers in the view port.
            foreach (var i in items)
            {
                MultiselectItem item = (MultiselectItem)(((WeakReference)i).Target);
                item.State = SelectionEnabledState.Closed;
                item.UpdateVisualState(true);
            }

            Dispatcher.BeginInvoke(() =>
            {
                for (int j = 0; j < this.Items.Count; j++)
                {
                    MultiselectItem item = (MultiselectItem)ItemContainerGenerator.ContainerFromIndex(j);
                    if (item != null)
                    {
                        item.State = SelectionEnabledState.Closed;
                        item.UpdateVisualState(false);
                    }
                }
            });
        }
        /// <summary>
        /// Sets the vertical alignment of the hint panels to stretch if the
        /// height is not manually set. If it is, the alignment is set to top.
        /// </summary>
        /// <param name="obj">The dependency object.</param>
        /// <param name="e">The event information.</param>
        private static void OnHintPanelHeightPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            MultiselectItem source = (MultiselectItem)obj;

            if (source._outterHintPanel != null)
            {
                if (double.IsNaN((double)e.NewValue))
                {
                    source._outterHintPanel.VerticalAlignment = VerticalAlignment.Stretch;
                }
                else
                {
                    source._outterHintPanel.VerticalAlignment = VerticalAlignment.Top;
                }
            }

            if (source._innerHintPanel != null)
            {
                if (double.IsNaN(source.HintPanelHeight))
                {
                    source._innerHintPanel.VerticalAlignment = VerticalAlignment.Stretch;
                }
                else
                {
                    source._innerHintPanel.VerticalAlignment = VerticalAlignment.Top;
                }
            }
        }
        /// <summary>
        /// ContentInfoTemplate changed handler.
        /// </summary>
        /// <param name="obj">The dependency object.</param>
        /// <param name="e">The event information.</param>
        private static void OnContentInfoTemplatePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            MultiselectItem source      = (MultiselectItem)obj;
            DataTemplate    oldTemplate = e.OldValue as DataTemplate;
            DataTemplate    newTemplate = e.NewValue as DataTemplate;

            source.OnContentInfoTemplateChanged(oldTemplate, newTemplate);
        }
예제 #4
0
        /// <summary>
        /// Opens or closes the selection mode accordingly.
        /// If closing, it unselects any selected item.
        /// Finally, it fires up an IsSelectionEnabledChanged event.
        /// </summary>
        /// <param name="obj">The dependency object.</param>
        /// <param name="e">The event information.</param>
        private static void OnIsSelectionEnabledPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            MultiselectList target = (MultiselectList)obj;

            if ((bool)e.NewValue)
            {
                target.OpenSelection();
            }
            else
            {
                if (target.SelectedItems.Count > 0)
                {
                    IList removedItems = new List <object>();

                    //All the selected items will be unselected.
                    foreach (object item in target.SelectedItems)
                    {
                        removedItems.Add(item);
                    }

                    //Unselect the containers that are not virtualized.
                    for (int k = 0; k < target.Items.Count && target.SelectedItems.Count > 0; k++)
                    {
                        MultiselectItem item = (MultiselectItem)target.ItemContainerGenerator.ContainerFromIndex(k);
                        if (item != null)
                        {
                            if (item.IsSelected == true)
                            {
                                item._canTriggerSelectionChanged = false;
                                item.IsSelected = false;
                                item._canTriggerSelectionChanged = true;
                            }
                        }
                    }

                    //Clear the selected items and trigger event.
                    target.SelectedItems.Clear();
                    target.OnSelectionChanged(removedItems, new object[0]);
                }

                target.CloseSelection();
            }

            var handler = target.IsSelectionEnabledChanged;

            if (handler != null)
            {
                handler(obj, e);
            }
        }
예제 #5
0
        /// <summary>
        /// Resets new or reused item containers appropiately.
        /// </summary>
        /// <param name="element"></param>
        /// <param name="item"></param>
        protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
        {
            base.PrepareContainerForItemOverride(element, item);

            MultiselectItem container = (MultiselectItem)element;

            container.Style = this.ItemContainerStyle;
            container._isBeingVirtualized = true;

            //Select or unselect item containers to put or clear checkmarks.
            container.IsSelected = SelectedItems.Contains(item);

            //Open or close item containers depending on the selection mode.
            container.State = IsSelectionEnabled ? SelectionEnabledState.Opened : SelectionEnabledState.Closed;

            container.UpdateVisualState(false);
            container._isBeingVirtualized = false;
        }
        /// <summary>
        /// Adds or removes the item to the selected items collection
        /// in the Multiselect List that owns it.
        /// </summary>
        /// <param name="obj">The dependency object.</param>
        /// <param name="e">The event information.</param>
        private static void OnIsSelectedPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            MultiselectItem item       = (MultiselectItem)obj;
            RoutedEventArgs args       = new RoutedEventArgs();
            bool            isSelected = (bool)e.NewValue;

            if (isSelected)
            {
                item.OnSelected(args);
            }
            else
            {
                item.OnUnselected(args);
            }

            //Ignore items being selected/unselected during parent virtualization.
            if (item._parent != null && !item._isBeingVirtualized)
            {
                if (isSelected)
                {
                    item._parent.SelectedItems.Add(item.Content);

                    //Trigger a selection changed event for one added item.
                    if (item._canTriggerSelectionChanged)
                    {
                        item._parent.OnSelectionChanged(new object[0], new object[] { item.Content });
                    }
                }
                else
                {
                    item._parent.SelectedItems.Remove(item.Content);

                    //Trigger a selection changed event for one removed item.
                    if (item._canTriggerSelectionChanged)
                    {
                        item._parent.OnSelectionChanged(new object[] { item.Content }, new object[0]);
                    }
                }
            }
        }
        /// <summary>
        /// ContentInfoProperty changed handler.
        /// </summary>
        /// <param name="obj">The dependency object.</param>
        /// <param name="e">The event information.</param>
        private static void OnContentInfoPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            MultiselectItem source = (MultiselectItem)obj;

            source.OnContentInfoChanged(e.OldValue, e.NewValue);
        }