gpt4 book ai didi

wpf - 如何创建自动滚动文本框

转载 作者:行者123 更新时间:2023-12-03 02:06:54 24 4
gpt4 key购买 nike

我有一个 WPF 应用程序,其中包含一个用于显示调试文本输出的多行文本框。

如何设置文本框,以便当文本附加到框中时,它会自动滚动到文本框的底部?

  • 我正在使用 MVVM 模式。
  • 理想情况下,纯 XAML 方法会很好。
  • 文本框本身不一定处于焦点中。

最佳答案

@BojinLi 提供的答案效果很好。然而,在阅读了 @GazTheDestroyer 链接的答案后,我决定为 TextBox 实现我自己的版本,因为它看起来更干净。

总而言之,您可以使用附加属性来扩展 TextBox 控件的行为。 (称为 ScrollOnTextChanged)

使用很简单:

<TextBox src:TextBoxBehaviour.ScrollOnTextChanged="True" VerticalScrollBarVisibility="Auto" />

这是 TextBoxBehaviour 类:

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;

namespace MyNamespace
{
public class TextBoxBehaviour
{
static readonly Dictionary<TextBox, Capture> _associations = new Dictionary<TextBox, Capture>();

public static bool GetScrollOnTextChanged(DependencyObject dependencyObject)
{
return (bool)dependencyObject.GetValue(ScrollOnTextChangedProperty);
}

public static void SetScrollOnTextChanged(DependencyObject dependencyObject, bool value)
{
dependencyObject.SetValue(ScrollOnTextChangedProperty, value);
}

public static readonly DependencyProperty ScrollOnTextChangedProperty =
DependencyProperty.RegisterAttached("ScrollOnTextChanged", typeof (bool), typeof (TextBoxBehaviour), new UIPropertyMetadata(false, OnScrollOnTextChanged));

static void OnScrollOnTextChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
var textBox = dependencyObject as TextBox;
if (textBox == null)
{
return;
}
bool oldValue = (bool) e.OldValue, newValue = (bool) e.NewValue;
if (newValue == oldValue)
{
return;
}
if (newValue)
{
textBox.Loaded += TextBoxLoaded;
textBox.Unloaded += TextBoxUnloaded;
}
else
{
textBox.Loaded -= TextBoxLoaded;
textBox.Unloaded -= TextBoxUnloaded;
if (_associations.ContainsKey(textBox))
{
_associations[textBox].Dispose();
}
}
}

static void TextBoxUnloaded(object sender, RoutedEventArgs routedEventArgs)
{
var textBox = (TextBox) sender;
_associations[textBox].Dispose();
textBox.Unloaded -= TextBoxUnloaded;
}

static void TextBoxLoaded(object sender, RoutedEventArgs routedEventArgs)
{
var textBox = (TextBox) sender;
textBox.Loaded -= TextBoxLoaded;
_associations[textBox] = new Capture(textBox);
}

class Capture : IDisposable
{
private TextBox TextBox { get; set; }

public Capture(TextBox textBox)
{
TextBox = textBox;
TextBox.TextChanged += OnTextBoxOnTextChanged;
}

private void OnTextBoxOnTextChanged(object sender, TextChangedEventArgs args)
{
TextBox.ScrollToEnd();
}

public void Dispose()
{
TextBox.TextChanged -= OnTextBoxOnTextChanged;
}
}

}
}

关于wpf - 如何创建自动滚动文本框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10097417/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com