我正在尝试创建一个新的自定义控件,它继承自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>
谢谢, 富
答案 0 :(得分:2)
当然不是,你完全覆盖了Style,尤其是ControlTemplate
。你的控制只是一个边界,就是所有。没有文字输入,没有文字显示没有任何东西。您需要至少实现模板中的基础知识,以使您的CBufferedTextBox表现得像您期望的那样。
我还想指出,你的new void AppendText
非常危险,可能无法达到预期效果。在您的Flush方法中,您调用RichtText框的AppendText而不是您的。新的与覆盖不同。 RichTextBox永远不会在内部调用您的方法,即使它是您的新类型CBufferedTextBox。