2013-09-01 48 views
-2

我想弄清楚如何清除我在桌面上創建的繪圖。聽說最好的方法是使用this.Invalidate()。無法找到無效的方法爲MainWindow

問題是當我將其添加到代碼Visual Studio無法識別該方法。我正在使用VS Express for Desktop 2012和.NET 4.5。

任何想法?

錯誤消息:

「WpfApplication1.MainWindow」不包含 「的Invalidate」的定義和沒有擴展方法「的Invalidate」接受型的第一 參數「WpfApplication1.MainWindow」可以發現(你 缺少using指令或程序集引用?)

下面是代碼:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 

     InitializeComponent(); 

     System.Windows.Forms.Timer _timer = new Timer() { Interval = 1, Enabled = true }; 
     _timer.Tick += new EventHandler(Timer_Tick); 

    } 

    private void Timer_Tick(object sender, EventArgs e) 
    { 
     using (Graphics g = Graphics.FromHwnd(IntPtr.Zero)) 
     { 
      System.Drawing.Point pt = System.Windows.Forms.Cursor.Position; 

      g.DrawEllipse(Pens.Black, pt.X - 10, pt.Y - 10, 20, 20);     
     } 

     this.Invalidate(); 
    } 
} 

編輯:

大家都非常感謝您的領導。

我試過使用RedrawWindow(),但程序每次開始測試時都會崩潰。有任何想法嗎?我試圖用這個矩形rc更新桌面。

例如RECT = new RECT(pt.X-20,pt.Y-20,pt.X + 20,pt.Y + 20); RedrawWindow(IntPtr.Zero,rc,IntPtr.Zero,0x0400/* RDW_FRAME */| 0x0100/* RDW_UPDATENOW */| 0x0001/* RDW_INVALIDATE * /);

任何想法?

+0

在P/Invoke的聲明,您需要無效_desktop window_,使用本機API調用。 – SLaks

+2

您使用的是「WPF」,而不是「Winforms」。 –

+0

[Invalidate own WPF control]可能的重複(http://stackoverflow.com/questions/8575203/invalidate-own-wpf-control) –

回答

1

由於您在桌面上繪圖使主窗口失效不會起作用。您需要使Desktop無效。

要做到這一點使用RedrawWindow函數。

這裏是RedrawWindow

+0

謝謝你的擡頭。我試過使用Pinvoke,但由於某種原因,RedrawWindow()似乎沒有重繪任何東西。 –

+0

我會建議你用不適合你的代碼創建一個新問題。將盡力幫助。 –

+0

謝謝,創建新的問題@ http://stackoverflow.com/questions/18684323/erasing-drawn-objects-on-desktop-using-c-sharp-wpf –

1

Invalidate()方法是Windows窗體方法,但你正在使用WPF。 在WPF中,使用InvalidateVisual(),Windows窗體的WPF等效項'Invalidate()

+0

InvalidateVisual()不等於Windows.Forms Invalidate()。它*更*更昂貴。有效更改WPF繪圖視覺的正確方法是製作一個DrawingGroup,在OnRender()期間將其放置在可視化樹中,然後再打開(),並更新其中的繪圖命令。 WPF會自動更新用戶界面。 –