/// <summary> /// Retrieves a UI Automation provider for each child element that is /// selected. /// </summary> /// <returns>An array of UI Automation providers.</returns> /// <remarks> /// This API supports the .NET Framework infrastructure and is not /// intended to be used directly from your code. /// </remarks> public IRawElementProviderSimple[] GetSelection() { RatingItem selectedRatingItem = OwnerRating.GetRatingItems().LastOrDefault(ratingItem => ratingItem.Value > 0.0); if (selectedRatingItem != null) { return(new[] { ProviderFromPeer(FromElement(selectedRatingItem)) }); } return(new IRawElementProviderSimple[] { }); }
/// <summary> /// Adds the RatingItem to the collection of selected items. /// </summary> /// <remarks> /// This API supports the .NET Framework infrastructure and is not /// intended to be used directly from your code. /// </remarks> void ISelectionItemProvider.AddToSelection() { RatingItem owner = OwnerRatingItem; Rating parent = owner.ParentRating; if (parent == null || parent.Value != null) { throw new InvalidOperationException("Operation cannot be performed."); } owner.SelectValue(); }
/// <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(); double value = (ratingItems .Take(ratingItems.IndexOf(ratingItem)) .Count() + newValue) / total; Value = value; }
/// <summary> /// Updates the values of the rating items. /// </summary> private void UpdateValues() { IList <RatingItem> ratingItems = GetRatingItems().ToList(); RatingItem oldSelectedItem = GetSelectedRatingItem(); IEnumerable <Tuple <RatingItem, double> > itemAndWeights = EnumerableFunctions .Zip( ratingItems, ratingItems .Select(ratingItem => 1.0) .GetWeightedValues(Value.GetValueOrDefault()), (item, percent) => Tuple.Create(item, percent)); foreach (Tuple <RatingItem, double> itemAndWeight in itemAndWeights) { itemAndWeight.Item1.Value = itemAndWeight.Item2; } RatingItem newSelectedItem = GetSelectedRatingItem(); // Notify when the selection changes if (oldSelectedItem != newSelectedItem) { if (newSelectedItem != null && AutomationPeer.ListenerExists(AutomationEvents.SelectionItemPatternOnElementSelected)) { AutomationPeer peer = UIElementAutomationPeer.CreatePeerForElement(newSelectedItem); if (peer != null) { peer.RaiseAutomationEvent(AutomationEvents.SelectionItemPatternOnElementSelected); } } if (oldSelectedItem != null && AutomationPeer.ListenerExists(AutomationEvents.SelectionItemPatternOnElementRemovedFromSelection)) { AutomationPeer peer = UIElementAutomationPeer.CreatePeerForElement(oldSelectedItem); if (peer != null) { peer.RaiseAutomationEvent(AutomationEvents.SelectionItemPatternOnElementRemovedFromSelection); } } } if (HoveredRatingItem == null) { DisplayValue = Value.GetValueOrDefault(); } }
/// <summary> /// Removes the current Rating from the collection of selected /// items. /// </summary> /// <remarks> /// This API supports the .NET Framework infrastructure and is not /// intended to be used directly from your code. /// </remarks> void ISelectionItemProvider.RemoveFromSelection() { RatingItem owner = OwnerRatingItem; Rating parent = owner.ParentRating; if (parent == null) { throw new InvalidOperationException("Operation cannot be performed."); } if (!parent.IsReadOnly) { parent.Value = null; } }
/// <summary> /// Selects a rating item. /// </summary> /// <param name="selectedRatingItem">The selected rating item.</param> internal void SelectRatingItem(RatingItem selectedRatingItem) { if (!IsReadOnly) { 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; Value = percent; } } }
/// <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(DisplayValue), (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 && !IsReadOnly) { IList <RatingItem> ratingItems = GetRatingItems().ToList(); int indexOfItem = ratingItems.IndexOf(HoveredRatingItem); double total = ratingItems.Count(); double filled = indexOfItem + 1; DisplayValue = filled / total; for (int cnt = 0; cnt < ratingItems.Count; cnt++) { RatingItem ratingItem = ratingItems[cnt]; if (cnt <= indexOfItem && SelectionMode == RatingSelectionMode.Continuous) { VisualStates.GoToState(ratingItem, true, VisualStates.StateMouseOver); } else { IUpdateVisualState updateVisualState = ratingItem; updateVisualState.UpdateVisualState(true); } } } else { DisplayValue = Value.GetValueOrDefault(); foreach (IUpdateVisualState updateVisualState in GetRatingItems().OfType <IUpdateVisualState>()) { updateVisualState.UpdateVisualState(true); } } }
/// <summary> /// Initializes a new instance of the RatingAutomationPeer class. /// </summary> /// <param name="owner"> /// The Rating that is associated with this /// RatingAutomationPeer. /// </param> public RatingItemAutomationPeer(RatingItem owner) : base(owner) { }
protected override void OnKeyDown(KeyEventArgs e) { if (!Interaction.AllowKeyDown(e)) { return; } base.OnKeyDown(e); if (e.Handled) { return; } switch (e.Key) { case Key.Left: { #if SILVERLIGHT RatingItem ratingItem = FocusManager.GetFocusedElement() as RatingItem; #else var ratingItem = FocusManager.GetFocusedElement(Application.Current.MainWindow) as RatingItem; #endif if (ratingItem != null) { ratingItem = GetRatingItemAtOffsetFrom(ratingItem, -1); } else { ratingItem = GetRatingItems().FirstOrDefault(); } if (ratingItem != null) { if (ratingItem.Focus()) { e.Handled = true; } } } break; case Key.Right: { #if SILVERLIGHT RatingItem ratingItem = FocusManager.GetFocusedElement() as RatingItem; #else var ratingItem = FocusManager.GetFocusedElement(Application.Current.MainWindow) as RatingItem; #endif if (ratingItem != null) { ratingItem = GetRatingItemAtOffsetFrom(ratingItem, 1); } else { ratingItem = GetRatingItems().FirstOrDefault(); } if (ratingItem != null) { if (ratingItem.Focus()) { e.Handled = true; } } } break; case Key.Add: { if (!IsReadOnly) { RatingItem ratingItem = GetSelectedRatingItem(); if (ratingItem != null) { ratingItem = GetRatingItemAtOffsetFrom(ratingItem, 1); } else { ratingItem = GetRatingItems().FirstOrDefault(); } if (ratingItem != null) { ratingItem.SelectValue(); e.Handled = true; } } } break; case Key.Subtract: { if (!IsReadOnly) { RatingItem ratingItem = GetSelectedRatingItem(); if (ratingItem != null) { ratingItem = GetRatingItemAtOffsetFrom(ratingItem, -1); } if (ratingItem != null) { ratingItem.SelectValue(); e.Handled = true; } } } break; } }