/// <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; }
/// <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; } }
/// <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); } }
/// <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); }
/// <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; } } }
/// <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); }
/// <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); }
/// <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; } } }
/// <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); } } }
/// <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); }
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; } }