代码之家  ›  专栏  ›  技术社区  ›  scobi

如何防止wpf编辑框滚动到程序化selectall的结尾?

wpf
  •  2
  • scobi  · 技术社区  · 15 年前

    我有一个文本框,它在获得焦点时执行selectAll()。工作很好。问题是,如果内容不适合该框,则selectall将导致内容滚动到末尾。我希望它滚动到前面-这个框与数字字段一起使用。

    我的问题是:是否可以选择all(),但避免滚动?

    我现在的解决方法是把一个滚动条排成一列。我不太喜欢这个,因为它有时会在文本呈现在一个位置然后另一个位置时引起弹出。

        public new void SelectAll()
        {
            base.SelectAll();
    
            // changing selection does something with a queued scroll request, so have to queue ours in the back. this still may cause a flash
            // if a render slips through. would like to find a better way to do this.
            Dispatcher.BeginInvoke(DispatcherPriority.Background, ScrollToHome);
        }
    

    请注意,ScrollToHome必须像这样排队,否则它会因为其他排队事件而被“覆盖”。我猜测文本框系统内部会有一个通知更改事件。我在源代码中查了一下,它相当复杂,很难确切地知道它在哪里执行滚动请求。

    所以我要找的是以下之一:

    1. 如何选择All(),而不进行任何滚动或滚动到前面。
    2. 如何强制更新显示器,以避免弹出窗口。
    2 回复  |  直到 15 年前
        1
  •  3
  •   repka    15 年前

    包装你的 SelectAll() ScrollToHome() 打电话 BeginChange() EndChange() . 这样可以避免重新喷漆:

    public new void SelectAll()
    {
        BeginChange();
        SelectAll();
        ScrollToHome();
        EndChange();
    }
    

    另一种选择是把注意力从 TextBox ,然后进行选择。

        2
  •  0
  •   aggieNick02    12 年前

    我有一个完全相同的问题(当它获得焦点时选择全部的文本框,我希望它滚动到开始而不是结束),但是在Silverlight中。这里没有开头和结尾的变化,所以我基本上也找到了斯科特·比拉斯的答案。

    这意味着我看到了重新粉刷,这是令人沮丧的,但这是我现在能想出的最好的办法。为了让它更黑,仅仅一个begininvoke是不够的,因为自动滚动到底部是排队的,有时会发生在begininvoke操作之后,所以我必须引入一个人工延迟(在begininvoke之前在新线程中生成并休眠10毫秒),以使它更可靠。所以我就这样结束了:

    var scrollViewer = VisualTreeWalker.FindVisualChildren<ScrollViewer>(TextBox)
        .FirstOrDefault();
    
    new Thread(delegate()
    {
        Thread.Sleep(10);
        scrollViewer.Dispatcher.BeginInvoke(() =>
        {
            scrollViewer.ScrollToLeft();
            scrollViewer.ScrollToTop();
        });
    }).Start();
    

    我玩过做依赖属性观察程序来观察文本框中滚动查看器的HorizontalOffset,然后在HorizontalOffset变为非零时进行BeginInvoke,但这只需要太多的特殊情况。如果文本框中没有足够的文本来导致自动滚动,那么水平loffset将保持为0会怎么样?然后,一个合法的用户编辑,应该导致滚动将被滚动回顶部/左侧。它刚变成一个大兔子洞,所以我必须满足于这个可怕的黑客。