예제 #1
0
        /// <summary>
        /// This method is invoked when the rating item value is changed.
        /// </summary>
        /// <param name="ratingItem">The rating item that has changed.</param>
        /// <param name="newValue">The new value.</param>
        protected virtual void OnRatingItemValueSelected(RatingItem ratingItem, double newValue)
        {
            List <RatingItem> ratingItems = GetRatingItems().ToList();
            double            total       = ratingItems.Count();

            this.Value = ratingItems.IndexOf(ratingItem) + 1;
        }
예제 #2
0
        /// <summary>
        /// Updates the values of the rating items.
        /// </summary>
        private void UpdateValues()
        {
            IList <RatingItem> ratingItems = GetRatingItems().ToList();

            RatingItem oldSelectedItem = this.GetSelectedRatingItem();

            IEnumerable <Tuple <RatingItem, double> > itemAndWeights =
                EnumerableFunctions
                .Zip(
                    ratingItems,
                    ratingItems
                    .Select(ratingItem => 1.0)
                    .GetWeightedValues(WeightedValue),
                    (item, percent) => Tuple.Create(item, percent));

            foreach (Tuple <RatingItem, double> itemAndWeight in itemAndWeights)
            {
                itemAndWeight.Item1.Value = itemAndWeight.Item2;
            }

            RatingItem newSelectedItem = this.GetSelectedRatingItem();

            if (HoveredRatingItem == null)
            {
                DisplayValue = WeightedValue;
            }
        }
예제 #3
0
 /// <summary>
 /// This method is raised when a rating item value is selected.
 /// </summary>
 /// <param name="sender">The source of the event.</param>
 /// <param name="e">Information about the event.</param>
 private void RatingItemTapped(object sender, RoutedEventArgs e)
 {
     if (this.IsEnabled)
     {
         RatingItem item = (RatingItem)sender;
         OnRatingItemValueSelected(item, 1.0);
     }
 }
예제 #4
0
        /// <summary>
        /// This method prepares a container to host an item.
        /// </summary>
        /// <param name="element">The container.</param>
        /// <param name="item">The item hosted in the container.</param>
        protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
        {
            RatingItem ratingItem = (RatingItem)element;

            var index = ItemContainerGenerator.IndexFromContainer(element);

            if (index > -1)
            {
                ToolTipService.SetToolTip(ratingItem, ((index + 1).ToString()));
            }

            ratingItem.SetBinding(Control.ForegroundProperty, new Binding()
            {
                Path = new PropertyPath("Foreground"), Source = this
            });
            ratingItem.SetBinding(RatingItem.PointerOverFillProperty, new Binding()
            {
                Path = new PropertyPath("PointerOverFill"), Source = this
            });
            ratingItem.SetBinding(RatingItem.PointerPressedFillProperty, new Binding()
            {
                Path = new PropertyPath("PointerPressedFill"), Source = this
            });
            ratingItem.SetBinding(RatingItem.FontSizeProperty, new Binding()
            {
                Path = new PropertyPath("FontSize"), Source = this
            });
            ratingItem.SetBinding(RatingItem.TagProperty, new Binding()
            {
                Path = new PropertyPath("Tag"), Source = this
            });
            ratingItem.SetBinding(RatingItem.BackgroundProperty, new Binding()
            {
                Path = new PropertyPath("Background"), Source = this
            });
            ratingItem.SetBinding(RatingItem.ReadOnlyFillProperty, new Binding()
            {
                Path = new PropertyPath("ReadOnlyFill"), Source = this
            });

            ratingItem.IsEnabled = this.IsEnabled;
            if (ratingItem.Style == null)
            {
                ratingItem.Style = this.ItemContainerStyle;
            }
            ratingItem.Click          += RatingItemTapped;
            ratingItem.PointerEntered += RatingItemPointerEnter;
            ratingItem.PointerExited  += RatingItemPointerExited;

            ratingItem.ParentRating = this;
            base.PrepareContainerForItemOverride(element, item);
        }
예제 #5
0
 /// <summary>
 /// Selects a rating item.
 /// </summary>
 /// <param name="selectedRatingItem">The selected rating item.</param>
 internal void SelectRatingItem(RatingItem selectedRatingItem)
 {
     if (this.IsEnabled)
     {
         IList <RatingItem>   ratingItems = GetRatingItems().ToList();
         IEnumerable <double> weights     = ratingItems.Select(ratingItem => 1.0);
         double total = ratingItems.Count();
         double percent;
         if (total != 0)
         {
             percent    = weights.Take(ratingItems.IndexOf(selectedRatingItem) + 1).Sum() / total;
             this.Value = percent;
         }
     }
 }
예제 #6
0
        /// <summary>
        /// This method clears a container used to host an item.
        /// </summary>
        /// <param name="element">The container that hosts the item.</param>
        /// <param name="item">The item hosted in the container.</param>
        protected override void ClearContainerForItemOverride(DependencyObject element, object item)
        {
            RatingItem ratingItem = (RatingItem)element;

            ratingItem.Click          -= RatingItemTapped;
            ratingItem.PointerEntered -= RatingItemPointerEnter;
            ratingItem.PointerExited  -= RatingItemPointerExited;
            ratingItem.ParentRating    = null;

            if (ratingItem == HoveredRatingItem)
            {
                HoveredRatingItem = null;
                UpdateDisplayValues();
                UpdateHoverStates();
            }

            base.ClearContainerForItemOverride(element, item);
        }
예제 #7
0
        /// <summary>
        /// Gets a rating item at a certain index offset from another
        /// rating item.
        /// </summary>
        /// <param name="ratingItem">The rating item.</param>
        /// <param name="offset">The rating item at an offset from the
        /// index of the rating item.</param>
        /// <returns>The rating item at the offset.</returns>
        private RatingItem GetRatingItemAtOffsetFrom(RatingItem ratingItem, int offset)
        {
            IList <RatingItem> ratingItems = GetRatingItems().ToList();
            int index = ratingItems.IndexOf(ratingItem);

            if (index == -1)
            {
                return(null);
            }
            index += offset;
            if (index >= 0 && index < ratingItems.Count)
            {
                ratingItem = ratingItems[index];
            }
            else
            {
                ratingItem = null;
            }
            return(ratingItem);
        }
예제 #8
0
        /// <summary>
        /// Updates the value and actual value of the rating items.
        /// </summary>
        private void UpdateDisplayValues()
        {
            IList <RatingItem> ratingItems = GetRatingItems().ToList();

            IEnumerable <Tuple <RatingItem, double> > itemAndWeights =
                EnumerableFunctions
                .Zip(
                    ratingItems,
                    ratingItems
                    .Select(ratingItem => 1.0)
                    .GetWeightedValues(WeightedValue),
                    (item, percent) => Tuple.Create(item, percent));

            RatingItem selectedItem = null;
            Tuple <RatingItem, double> selectedItemAndWeight = itemAndWeights.LastOrDefault(i => i.Item2 > 0.0);

            if (selectedItemAndWeight != null)
            {
                selectedItem = selectedItemAndWeight.Item1;
            }
            else
            {
                selectedItem = GetSelectedRatingItem();
            }

            foreach (Tuple <RatingItem, double> itemAndWeight in itemAndWeights)
            {
                if (SelectionMode == RatingSelectionMode.Individual && itemAndWeight.Item1 != selectedItem)
                {
                    itemAndWeight.Item1.DisplayValue = 0.0;
                }
                else
                {
                    itemAndWeight.Item1.DisplayValue = itemAndWeight.Item2;
                }
            }
        }
예제 #9
0
        /// <summary>
        /// Updates the hover states of the rating items.
        /// </summary>
        private void UpdateHoverStates()
        {
            if (HoveredRatingItem != null && IsEnabled)
            {
                IList <RatingItem> ratingItems = GetRatingItems().ToList();
                int indexOfItem = ratingItems.IndexOf(HoveredRatingItem);

                double total  = ratingItems.Count();
                double filled = indexOfItem + 1;

                this.DisplayValue = filled / total;

                for (int cnt = 0; cnt < ratingItems.Count; cnt++)
                {
                    RatingItem ratingItem = ratingItems[cnt];
                    if (cnt <= indexOfItem && this.SelectionMode == RatingSelectionMode.Continuous)
                    {
                        VisualStates.GoToState(ratingItem, true, VisualStates.StatePointerOver);
                    }
                    else
                    {
                        IUpdateVisualState updateVisualState = (IUpdateVisualState)ratingItem;
                        updateVisualState.UpdateVisualState(true);
                    }
                }
            }
            else
            {
                this.DisplayValue = this.Value;

                foreach (IUpdateVisualState updateVisualState in GetRatingItems().OfType <IUpdateVisualState>())
                {
                    updateVisualState.UpdateVisualState(true);
                }
            }
        }
예제 #10
0
        /// <summary>
        /// DisplayValueProperty property changed handler.
        /// </summary>
        /// <param name="d">RatingItem that changed its DisplayValue.</param>
        /// <param name="e">Event arguments.</param>
        private static void OnDisplayValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            RatingItem source = (RatingItem)d;

            source.OnDisplayValueChanged((double)e.OldValue, (double)e.NewValue);
        }
예제 #11
0
        protected override void OnKeyDown(KeyRoutedEventArgs e)
        {
            if (!Interaction.AllowKeyDown(e))
            {
                return;
            }

            base.OnKeyDown(e);

            if (e.Handled)
            {
                return;
            }

            // Some keys (e.g. Left/Right) need to be translated in RightToLeft mode
            VirtualKey invariantKey = InteractionHelper.GetLogicalKey(FlowDirection, e.Key);

            switch (invariantKey)
            {
            case VirtualKey.Left:
            {
                RatingItem ratingItem = FocusManager.GetFocusedElement() as RatingItem;

                if (ratingItem != null)
                {
                    ratingItem = GetRatingItemAtOffsetFrom(ratingItem, -1);
                }
                else
                {
                    ratingItem = GetRatingItems().FirstOrDefault();
                }
                if (ratingItem != null)
                {
                    if (ratingItem.Focus(FocusState.Keyboard))
                    {
                        e.Handled = true;
                    }
                }
            }
            break;

            case VirtualKey.Right:
            {
                RatingItem ratingItem = FocusManager.GetFocusedElement() as RatingItem;

                if (ratingItem != null)
                {
                    ratingItem = GetRatingItemAtOffsetFrom(ratingItem, 1);
                }
                else
                {
                    ratingItem = GetRatingItems().FirstOrDefault();
                }
                if (ratingItem != null)
                {
                    if (ratingItem.Focus(FocusState.Keyboard))
                    {
                        e.Handled = true;
                    }
                }
            }
            break;

            case VirtualKey.Add:
            {
                if (this.IsEnabled)
                {
                    RatingItem ratingItem = GetSelectedRatingItem();
                    if (ratingItem != null)
                    {
                        ratingItem = GetRatingItemAtOffsetFrom(ratingItem, 1);
                    }
                    else
                    {
                        ratingItem = GetRatingItems().FirstOrDefault();
                    }
                    if (ratingItem != null)
                    {
                        ratingItem.SelectValue();
                        e.Handled = true;
                    }
                }
            }
            break;

            case VirtualKey.Subtract:
            {
                if (this.IsEnabled)
                {
                    RatingItem ratingItem = GetSelectedRatingItem();
                    if (ratingItem != null)
                    {
                        ratingItem = GetRatingItemAtOffsetFrom(ratingItem, -1);
                    }
                    if (ratingItem != null)
                    {
                        ratingItem.SelectValue();
                        e.Handled = true;
                    }
                }
            }
            break;
            }
        }