2014-02-26 87 views
1

爲了測試如何在OnRender中的其他控件上繪製,我創建了自己的基於TextBox的控件,並決定覆蓋它的OnRender方法。但似乎從來沒有叫。WPF控件OnRender覆蓋

下面是簡單的類我有:

public class MyTextBox : TextBox 
{ 
    protected override void OnRender(System.Windows.Media.DrawingContext drawingContext) 
    { 
     Console.WriteLine("OnRender"); 
     //base.OnRender(drawingContext); 
     Rect bounds = new Rect(0, 0, 100, 100); 
     Brush brush = new SolidColorBrush(Colors.Yellow); 
     drawingContext.DrawRectangle(brush, null, bounds); 
    } 
} 

我在XAML中聲明該類:

<local:MyTextBox Height="118" Margin="10,300,10,10" Text="TextBox" VerticalAlignment="Bottom" AcceptsReturn="True" Padding="0,0,200,0" FontSize="18" TextWrapping="Wrap" /> 

但目前還沒有跡象表明,所謂的OnRender甚至一次。我錯過了什麼?在其他控件上進行自定義繪圖的最佳選擇是什麼?

+1

你嘗試改變使用控件模板的外觀?我覺得您需要更多地瞭解WPF上提供的功能。 OnRender更多來自WinForm World – CarbineCoder

+2

您可能需要查看[adorners](http://msdn.microsoft.com/zh-cn/library/ms743737(v = vs.110).aspx)以繪製控件。如果你想要驗證的目的,看看[這篇文章](http://codeblitz.wordpress.com/2009/05/08/wpf-validation-made-easy-with-idataerrorinfo/ )。 –

+0

其實我來自可可世界。 WPF中的一些概念對我來說是非常新穎的:-( – dmitrynikolaev

回答

2

你應該覆蓋默認Textbox風格。

public class MyTextBox : TextBox 
{ 

    public MyTextBox() 
    { 
     DefaultStyleKey = typeof (MyTextBox); 
    } 

    protected override void OnRender(System.Windows.Media.DrawingContext drawingContext) 
    { 
     Console.WriteLine("OnRender"); 
     //base.OnRender(drawingContext); 
     Rect bounds = new Rect(0, 0, 100, 100); 
     Brush brush = new SolidColorBrush(Colors.Yellow); 
     drawingContext.DrawRectangle(brush, null, bounds); 
    } 
} 
+0

它可以工作(黃色的矩形),但現在編輯是不可能的 – dmitrynikolaev

+0

你需要清楚控件的覆蓋結構...你已經改變了'Textbox'結構和尋找'Textbox'似乎很好嗎? – Sankarann

+0

當取消註釋base.OnRender時,我只是預期與TextBox頂部的矩形相同的行爲,但似乎在該過程中涉及更多部分 – dmitrynikolaev