private void mainGrid_PreviewMouseUp(object sender, MouseButtonEventArgs e) { // is this the end of a drag operation? if (this.dragTumbler != null) { double offset = -Canvas.GetTop(this.dragTumbler); Point mousePt = Mouse.GetPosition(this.mainGrid); if (mousePt.Equals(this.dragPt)) { // user clicked on tumbler without dragging, select the clicked-on value offset += mousePt.Y - (this.mainGrid.ActualHeight / 2); } // find the Canvas offset for the value closest to where the drag ended TumblerData td = this.dragTumbler.Tag as TumblerData; double itemHeight = this.dragTumbler.ActualHeight / (td.Values.Count); double newVal = offset / itemHeight + 2; int iVal = (int)Math.Round(newVal); // update index, limit to valid values. The update will cause NotifyPropertyChanged which // will animate the tumbler into the appropriate position for the selected value td.SelectedValueIndex = Math.Min(Math.Max(0, iVal), td.Values.Count - 1); this.dragTumbler = null; } if (this.mainGrid.IsMouseCaptured && this.AlwaysOpen) { this.mainGrid.ReleaseMouseCapture(); } }
private void configureDaysOfMonth(TumblerData years, TumblerData months, TumblerData days) { int currentDay = int.Parse(days.Values[days.SelectedValueIndex].ToString()); var currentMonth = int.Parse(months.Values[months.SelectedValueIndex].ToString()); var currentYear = int.Parse(years.Values[years.SelectedValueIndex].ToString()); int daysInMonths = DateTime.DaysInMonth(currentYear, currentMonth); // El mes actual tiene menos dias que el seleccionado entonces se quitan while (days.Values.Count > daysInMonths) { days.Values.RemoveAt(days.Values.Count - 1); } // El mes actual tiene menos dias que el seleccion entonces se agregan. while (days.Values.Count < daysInMonths) { days.Values.Add(String.Format("{0:d2}", days.Values.Count + 1)); } if (currentDay > daysInMonths) { days.SelectedValueIndex = 0;// DateTime.DaysInMonth(currentYear, currentMonth) - 1; } }
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { TumblerData td = values[0] as TumblerData; bool isOpen = (bool)values[1]; int currentIndex = (int)values[2]; return(isOpen || (td != null && currentIndex == td.SelectedValueIndex) ? Visibility.Visible : Visibility.Hidden); }
/// <summary> /// Mouse wheel handler for tumblers. This is not a fired event because we need to mouse capture on the main grid /// so we can know when to close the control. Instead this event gets called via the MouseWheel event on the main grid. /// </summary> /// <param name="tumbler">The tumbler (grid) that should receive the mouse wheel event</param> /// <param name="e">the MouseWheelEventArgs forwarded from the main grid MouseWheel event</param> private void Tumbler_PreviewMouseWheel(Grid tumbler, MouseWheelEventArgs e) { if (tumbler != null) { TumblerData td = tumbler.Tag as TumblerData; // Each click in the mouse will increment or decrement the tumbler value by one int newIdx = td.SelectedValueIndex + (e.Delta > 0 ? 1 : -1); if (newIdx >= 0 && newIdx < td.Values.Count) { // Set the new index which will cause NotifyPropertyChanged to fire, which in turn will cause // the binding/converter to re-evaluate, which will result in the tumbler animating to the correct // canvas offset. td.SelectedValueIndex = newIdx; } } }
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { // TumblerDataToOffsetConverter is just a shell for getting SelectedValueChanged event and using it to adjust the items grid // canvas offset. Reason we don't just bind the Canvas.Top property directly is because that binding will // get lost when we manually set Canvas.Top via drag support Grid tumbler = values[0] as Grid; TumblerData td = tumbler.Tag as TumblerData; if (td != null) { double itemHeight = tumbler.ActualHeight / (td.Values.Count); double offset = td.SelectedValueIndex > 0 ? -(td.SelectedValueIndex - 2) * itemHeight : itemHeight * 2; // animate from current position to value offset DoubleAnimation da = new DoubleAnimation(); da.From = Canvas.GetTop(tumbler); da.To = offset; da.Duration = new Duration(TimeSpan.FromMilliseconds(100)); tumbler.BeginAnimation(Canvas.TopProperty, da); } return(values[2]); }