C# 继承WPF控件及其成员属性上的线程安全性

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

为了在文本框中添加新文本时启用自动向下滚动,我必须定义以下类。此外,我需要重写OnPreviewMouseLeftButtonDown和OnPreviewMouseLeftButtonUp方法,以便在用户单击滚动条时禁用自动向下滚动

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控件是不安全的。