Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Text Controls don't lose highlighting when unselected (TextBox / RichEditBox) #10071

Open
AlexanderBlackman opened this issue Oct 15, 2024 · 6 comments
Labels
bug Something isn't working needs-triage Issue needs to be triaged by the area owners

Comments

@AlexanderBlackman
Copy link

AlexanderBlackman commented Oct 15, 2024

Describe the bug

Selecting text highlights the text, but unselecting it still maintains the highlighted background colour.
Interestingly foreground colour doesn't persist after unselection.
This weird behaviour only occurs after the first visual row, which behaves normally.
Only multiline selections that include the first row behave normally.
This is a problem in both TextBox and RichEditBox.

All highlighting is lost when the control regains focus. (As expected)

Steps to reproduce the bug

Loaded the normal WinUI 3 app template.
Added a RichEditBox and a TextBox.

Highlight some text after the first visual row. (it doesn't matter if done by the keyboard or mouse)
Highlighted some other text to clicked elsewhere, the highlighting background colour still persists in the now unselected text.

No custom styling has been applied. Light/Dark theme doesn't change anything.
This bug occurs with both the default and newest WASDK

Expected behavior

Selected text should lose its highlighting if unselected.
This should happen no matter what line it is.

Screenshots

Image

NuGet package version

WinUI 3 - Windows App SDK 1.6.1: 1.6.240923002

Windows version

Windows 11 (22H2): Build 22621

Additional context

No response

@AlexanderBlackman AlexanderBlackman added the bug Something isn't working label Oct 15, 2024
@microsoft-github-policy-service microsoft-github-policy-service bot added the needs-triage Issue needs to be triaged by the area owners label Oct 15, 2024
Copy link

Hi I'm an AI powered bot that finds similar issues based off the issue title.

Please view the issues below to see if they solve your problem, and if the issue describes your problem please consider closing this one. Thank you!

Open similar issues:

Note: You can give me feedback by thumbs upping or thumbs downing this comment.

@AlexanderBlackman
Copy link
Author

AlexanderBlackman commented Oct 16, 2024

Further testing.

Partial success

  • If I locally set the text background to another background colour via ITextRange.CharacterFormat.BackgroundColor = (this.Background as SolidColorBrush)?.Color ?? Colors.Transparent;
    selection highlighting doesn't persist.
    Image

Failures

  • Calling InvalidateArrange() nor Document.ApplyDisplayUpdates() in a SelectionChanged event have no positive effect.
  • Setting the RichEditBox Background property doesn't change the weird behaviour.
  • Putting this in my Loaded event doesn't work, var myFormat = Document.GetDefaultCharacterFormat(); myFormat.BackgroundColor = (this.Background as SolidColorBrush)?.Color ?? Colors.Transparent;

@nynauy
Copy link

nynauy commented Nov 13, 2024

The same problem with WASDK 1.6.241106002.

@AlexanderBlackman
Copy link
Author

The same problem with WASDK 1.6.241106002.

Urgh, I won't be able to update or release anything until this is fixed. Text input is pretty much essential to any app.

@Foda
Copy link
Member

Foda commented Nov 25, 2024

CC: this is affecting customers of MAUI as well.

@ReneeHuh
Copy link

ReneeHuh commented Dec 10, 2024

I have found a partial fix with only a small amount of jumping of the scrollerviewer if the text box is inside of a scrollerviewer.

you need to hookup to the selectionchanged event, i left in the some old code of stuff that does not work or work well

private bool WasFullTestSelected = false;
private void FullTextBox_SelectionChanged(object sender, RoutedEventArgs e)
{
    if (sender is TextBox textBox)
    {
        bool isSelected = textBox.SelectionLength > 0;

        if (isSelected is true)
        {
            if (WasFullTestSelected is true)
            {
                //is selected true && was selected true

                //no change

                if (false)
                {
                    //cant run this because it will not work for a mouse move selection to continue
                    //but when dragging froward then backwards the issue will be on those chars 
                    //that where selected then deselected

                    var horizontalOffset = FullTextBoxScroll.HorizontalOffset;
                    var verticalOffset = FullTextBoxScroll.VerticalOffset;
 
                    FullTextBox.Visibility = Visibility.Collapsed;
                    FullTextBox.Visibility = Visibility.Visible;
                    FullTextBox.Focus(FocusState.Keyboard);
                    FullTextBoxScroll.ChangeView(horizontalOffset, verticalOffset, null, true);
                }
            }
            else
            {
                //is selected true && was selected false

                //now selected
            }
        }
        else
        {
            if (WasFullTestSelected is true)
            {
                //is selected false && was selected true

                //lost selection (the issue)
                if (false)
                {
                    //FullTextBoxScroll.InvalidateArrange();//does not work
                }
                if (false)
                {
                    //FullTextBox.InvalidateArrange();//does not work
                }
                if (false)
                {
                    //FullTextBox.InvalidateMeasure(); //does not work
                }
                if (false)
                {
                    //does not work
                    //var horizontalOffset = FullTextBoxScroll.HorizontalOffset;
                    //var verticalOffset = FullTextBoxScroll.VerticalOffset;
                    //FullTextBoxScroll.ChangeView(horizontalOffset, verticalOffset, null, true);
                }
                if (false)
                {
                    //works but buggy
                    //var horizontalOffset = FullTextBoxScroll.HorizontalOffset;
                    //var verticalOffset = FullTextBoxScroll.VerticalOffset;
                    //var selectionStart = FullTextBox.SelectionStart;
                    //var selectionLength = FullTextBox.SelectionLength;

                    //FullTextBox.SelectAll();
                    //FullTextBoxScroll.ChangeView(horizontalOffset, verticalOffset, null, true);
                    //FullTextBox.Select(selectionStart, selectionLength);
                    //FullTextBoxScroll.ChangeView(horizontalOffset, verticalOffset, null, true);
                }

                //works but jumps when it clears the selection can tolerate
                //least buggy of what i found.
                FullTextBox.Visibility = Visibility.Collapsed;
                FullTextBox.Visibility = Visibility.Visible;
                FullTextBox.Focus(FocusState.Programmatic);
            }
            else
            {
                //is selected false && was selected false
                //not selected
            }
        }
        WasFullTestSelected = isSelected;
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working needs-triage Issue needs to be triaged by the area owners
Projects
None yet
Development

No branches or pull requests

4 participants