Skip to content

Conversation

@Illustar0
Copy link

@Illustar0 Illustar0 commented Dec 3, 2025

Fixes #755 ,Fixes #819

PR Type

What kind of change does this PR introduce?

What is the current behavior?

No vertical orientation support for RangeSelector control.

What is the new behavior?

Add vertical orientation support for RangeSelector control.

PR Checklist

Please check if your PR fulfills the following requirements:

  • Created a feature/dev branch in your fork (vs. submitting directly from a commit on main)
  • Based off latest main branch of toolkit
  • Tested code with current supported SDKs
  • New component
    • Documentation has been added
    • Sample in sample app has been added
    • Analyzers are passing for documentation and samples
    • Icon has been created (if new sample) following the Thumbnail Style Guide and templates
  • Tests for the changes have been added (if applicable)
  • Header has been added to all new source files
  • Contains NO breaking changes

Other information

Image Image

Copilot AI review requested due to automatic review settings December 3, 2025 16:15
@Illustar0
Copy link
Author

Illustar0 commented Dec 3, 2025

@dotnet-policy-service agree

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds vertical orientation support to the RangeSelector control, allowing it to be displayed vertically in addition to the existing horizontal orientation. The implementation includes proper coordinate inversion for vertical mode (top = maximum value, bottom = minimum value), visual state management, and support for keyboard, pointer, and drag interactions in both orientations.

Key Changes

  • Added Orientation dependency property with horizontal/vertical support
  • Implemented coordinate inversion logic for vertical mode across all input methods
  • Added visual states for orientation with appropriate XAML template adjustments

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
RangeSelector.xaml Added OrientationStates visual state group with layout adjustments for vertical mode
RangeSelector.cs Added visual state constants, Loaded event handler for initial sync, and orientation-aware SyncThumbs/SyncActiveRectangle methods
RangeSelector.Properties.cs Added Orientation property with change callback that updates visual states and syncs thumbs
RangeSelector.Input.Pointer.cs Updated pointer event handlers to support vertical coordinate system with proper inversion
RangeSelector.Input.Key.cs Added Up/Down key support for vertical mode and refactored keyboard handling
RangeSelector.Input.Drag.cs Added DragThumbVertical method and updated drag handlers for vertical orientation
RangeSelector.md Added documentation section for vertical orientation with sample reference

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 1 comment.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@Illustar0 Illustar0 changed the title Add vertical orientation support for RangeSelector control [RangeSelector] Add support for vertical orientation Dec 3, 2025
@Illustar0 Illustar0 requested a review from Copilot December 4, 2025 17:17
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 7 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@Illustar0 Illustar0 marked this pull request as draft December 4, 2025 17:36
@Illustar0 Illustar0 marked this pull request as ready for review December 4, 2025 17:48
@Illustar0 Illustar0 force-pushed the feat/allow-vertical-rangeselector branch from 63e4657 to 5968456 Compare December 6, 2025 14:43
@michael-hawker michael-hawker added this to the 8.3 milestone Dec 8, 2025
@Illustar0 Illustar0 force-pushed the feat/allow-vertical-rangeselector branch from 5968456 to fa1323f Compare December 20, 2025 15:49
@michael-hawker michael-hawker added the preview Used to track feature Issues/PRs to include in the next preview release label Jan 5, 2026
@Arlodotexe Arlodotexe added components::controls::rangeselector A double Slider control that allows the user to select a sub-range of values from a larger range. enhancement New feature or request labels Jan 7, 2026
@Illustar0 Illustar0 force-pushed the feat/allow-vertical-rangeselector branch from fa1323f to 8a2c4a4 Compare January 9, 2026 13:11
Illustar0 and others added 8 commits January 10, 2026 11:05
- Introduced `GetKeyboardChange` helper to correctly handle directional keys (Left/Right) when `FlowDirection` is Right-To-Left.
- Refactored duplicate logic between MinThumb and MaxThumb to ensure consistent behavior across both vertical and horizontal orientations.

Fixes CommunityToolkit#819
- Add orientation selector to RangeSelectorSample for testing both horizontal and vertical modes
- Fix Canvas position property conflicts when switching between orientations by clearing old properties
- Change default VerticalAlignment from Stretch to Top to prevent breaking existing horizontal layouts
  - Vertical mode explicitly sets VerticalAlignment="Stretch" via VisualState
  - This preserves backward compatibility for existing horizontal RangeSelector usage
- Improve vertical mode visual states with explicit sizing and alignment setters for both orientations
- Set visual state transition to non-animated (false) to prevent layout glitches during orientation changes
- Update documentation with guidance on using VerticalAlignment="Stretch" for vertical orientation
Remove RangeSelectorVerticalSample as vertical orientation is now integrated into the main RangeSelectorSample with an orientation toggle option.

This consolidates the samples and provides a better user experience for testing both orientations in one place.
Align Minimum value with RangeStart for configuration consistency.
… code duplication

- Add UVPoint struct for abstraction of orientation-dependent coordinates
  - U represents primary axis (X for horizontal, Y for vertical)
  - V represents secondary axis
- Add UVPointExtensions for Canvas positioning and element sizing
- Merge DragThumb and DragThumbVertical into single unified method
- Simplify SyncThumbs and SyncActiveRectangle using UVPoint
- Refactor pointer event handlers to use UVPoint.FromPoint
- Add CalculateNormalizedPosition helper for value conversion
@Illustar0 Illustar0 force-pushed the feat/allow-vertical-rangeselector branch from ea3bd4d to 9074b65 Compare January 10, 2026 03:23
@Illustar0 Illustar0 requested a review from Avid29 January 10, 2026 03:24
Copy link
Contributor

@Avid29 Avid29 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You had the right idea with the UVPoint you'd written, but I had a specific implementation in mind because of a WIP refactor I have for other toolkit components which use the Orientation property. Here's a link to the branch. I should have been more upfront about that.

I've left some more comments showing how it would be used through the control

Your code before was clean though, I was just prepping for the future when I make this use the actual shared system. I recommend you either revert to the code before this change, or use the provided API. Entirely up to you.

Illustar0 and others added 3 commits January 11, 2026 14:33
- Introduce UVCoord struct that stores coordinates in XY space while providing UV accessors based on orientation
- Support construction from Point and Size types
- Add implicit conversion operators to Point and Size
- Implement arithmetic operators with orientation mismatch validation

Co-authored-by: Avishai Dernis <[email protected]>
Signed-off-by: Illustar0 <[email protected]>
- Replace UVPoint with UVCoord throughout pointer and drag handling
- Use UVCoord for drag delta calculations instead of ternary operators
- Add GetCanvasPos helper method to retrieve element positions as UVCoord
- Simplify size calculations using UVCoord.U and UVCoord.V properties
- Remove dependency on UVPoint extension methods (SetCanvasU, GetCanvasU, etc.)

Co-authored-by: Avishai Dernis <[email protected]>
Signed-off-by: Illustar0 <[email protected]>
- Delete UVPoint struct and its extension methods
- All usages have been migrated to UVCoord

Signed-off-by: Illustar0 <[email protected]>
@Illustar0 Illustar0 requested a review from Avid29 January 11, 2026 06:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

components::controls::rangeselector A double Slider control that allows the user to select a sub-range of values from a larger range. enhancement New feature or request preview Used to track feature Issues/PRs to include in the next preview release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] RangeSelector arrow-key inverted in RightToLeft [RangeSelector] Add support for vertical orientation

4 participants