89 lines
2.8 KiB
C#
89 lines
2.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
|
|
namespace eSuite.WorkBench.Utilities
|
|
{
|
|
public class TextBoxBehaviour
|
|
{
|
|
private 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;
|
|
}
|
|
}
|
|
|
|
}
|
|
} |