C# 继承WPF控件及其成员属性上的线程安全性
为了在文本框中添加新文本时启用自动向下滚动,我必须定义以下类。此外,我需要重写OnPreviewMouseLeftButtonDown和OnPreviewMouseLeftButtonUp方法,以便在用户单击滚动条时禁用自动向下滚动C# 继承WPF控件及其成员属性上的线程安全性,c#,.net,wpf,multithreading,thread-safety,C#,.net,Wpf,Multithreading,Thread Safety,为了在文本框中添加新文本时启用自动向下滚动,我必须定义以下类。此外,我需要重写OnPreviewMouseLeftButtonDown和OnPreviewMouseLeftButtonUp方法,以便在用户单击滚动条时禁用自动向下滚动 public class ScrollingTextBox : TextBox { private volatile bool _AutomaticScrollingEnabled = true; protected override void O
public class ScrollingTextBox : TextBox
{
private volatile bool _AutomaticScrollingEnabled = true;
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
HorizontalScrollBarVisibility = ScrollBarVisibility.Visible;
}
protected override void OnTextChanged(TextChangedEventArgs e)
{
base.OnTextChanged(e);
if (_AutomaticScrollingEnabled)
{
Focus();
CaretIndex = Text.Length;
ScrollToEnd();
}
}
protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e)
{
base.OnPreviewMouseLeftButtonDown(e);
object original = e.OriginalSource;
if (!original.GetType().Equals(typeof(ScrollViewer)))
{
if (FindVisualParent<ScrollBar>(original as DependencyObject) != null)
{
_AutomaticScrollingEnabled = false;
Trace.WriteLine("scroll bar is clicked down");
}
}
}
protected override void OnPreviewMouseLeftButtonUp(MouseButtonEventArgs e)
{
base.OnPreviewMouseLeftButtonUp(e);
object original = e.OriginalSource;
if (!original.GetType().Equals(typeof(ScrollViewer)))
{
if (FindVisualParent<ScrollBar>(original as DependencyObject) != null)
{
_AutomaticScrollingEnabled = true;
Trace.WriteLine("scroll bar is clicked up");
}
}
}
// ... other methods
}
只有以下方法使用_AutomaticScrollingEnabled成员属性:
OnPreviewMouseLeftButtonDown方法将此属性设置为false,以禁用文本框的自动向下滚动;
OnPreviewMouseLeftButtonUp方法将此属性设置为true,以启用文本框的自动向下滚动;
ContextChanged方法读取此属性,以查看文本框是否应自动滚动。
_AutomaticScrollingEnabled成员属性的线程安全性如何?将此属性声明为volatile是否正确?如果没有这个简单的布尔属性,而是有一个复杂的对象,我是否需要创建一个锁?我认为volatile或锁都不是必需的。UI线程将处理这些事件您希望有多个线程吗?所有这些事件都在UI线程上引发。通常,从多个线程访问UI控件是不安全的。