RichTextBox自定义控件

时间:2011-09-13 11:32:30

标签: c# wpf custom-controls richtextbox

我正在尝试创建一个新的自定义控件,它继承自RichTextBox。这样做的原因是为控件添加自定义缓冲(例如,每x毫秒和/或buffer.Length> x只附加文本。)

我已经设法创建控件并将其添加到xaml窗口,然而它似乎并没有正确地作为RichTextBox运行 - 文本在追加后不显示,并且光标没有' t悬停在控件上时更改图标

这似乎是相当简单的代码,所以我不确定我哪里出错了。

CBufferedTextBox.cs:

public class CBufferedTextBox : RichTextBox
{
    const int MAX_LENGTH = 2048;
    const int TIMER_LENGTH = 1000;

    DispatcherTimer m_timer = new DispatcherTimer();

    DispatcherTimer Timer
    {
        get { return m_timer; }
    }

    StringBuilder m_currentText = new StringBuilder();

    StringBuilder CurrentText
    {
        get { return m_currentText; }
    }


    static CBufferedTextBox()
    {
        DefaultStyleKeyProperty.OverrideMetadata( typeof( CBufferedTextBox ), new FrameworkPropertyMetadata( typeof( CBufferedTextBox ) ) );
    }


    public CBufferedTextBox()
    {
        Loaded += CBufferedTextBox_Loaded;
    }

    public CBufferedTextBox( FlowDocument document )
        : base( document )
    {
    }


    public new void AppendText( string strText )
    {
        CurrentText.Append( strText );

        if( !strText.EndsWith( Environment.NewLine ) )
        {
            CurrentText.AppendLine();
        }

        if( CurrentText.Length > MAX_LENGTH )
        {
            Flush();
        }
    }

    void CBufferedTextBox_Loaded( object sender, RoutedEventArgs e )
    {
        Timer.Interval = new TimeSpan( TIMER_LENGTH );
        Timer.Tick += new EventHandler( Timer_Tick );
        Timer.Start();
    }

    void Timer_Tick( object sender, EventArgs e )
    {
        Flush();
    }

    void Flush()
    {
        Timer.Stop();
        this.BeginInvokeIfRequired( o =>
        {
            if( CurrentText.Length > 0 )
            {
                base.AppendText( CurrentText.ToString() );

                // Clear
                CurrentText.Remove( 0, CurrentText.Length );

                ScrollToEnd();
            }

            Timer.Start();
        } );
    }
}

Generic.xaml:

<Style TargetType="{x:Type local:CBufferedTextBox}" BasedOn="{StaticResource {x:Type RichTextBox}}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CBufferedTextBox}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

谢谢, 富

1 个答案:

答案 0 :(得分:2)

当然不是,你完全覆盖了Style,尤其是ControlTemplate。你的控制只是一个边界,就是所有。没有文字输入,没有文字显示没有任何东西。您需要至少实现模板中的基础知识,以使您的CBufferedTextBox表现得像您期望的那样。

我还想指出,你的new void AppendText非常危险,可能无法达到预期效果。在您的Flush方法中,您调用RichtText框的AppendText而不是您的。新的与覆盖不同。 RichTextBox永远不会在内部调用您的方法,即使它是您的新类型CBufferedTextBox。