2011-07-18 41 views
2
  1. WPF控制派生類具有非WPF控制派生類的組合物。後一類,說內部,應該觸發外部類WPF的DependencyProperty更改。對WPF控件派生類的非WPF實例回調。變化的DependencyProperty

  2. 基本不變的是,我的內蒙古不應強迫任何WPF命名空間使用因此,是一個DLL,我創建的API的一部分。所以從任何WPF類繼承是不合適的解決方案。

什麼可能是最好的(或至少arbitraty)的方式來實現從non-.NET派生類的WPF的控制類來改變一個DependencyProperty對象的回調。

發現的一些假設的回調機制:

  • C#委託和C#事件

解決不了這個,becouce它拋出一個運行時異常

The calling thread cannot access this object because a different thread owns it. 
當回調機制試圖修改背景屬性

(一DependancyProperty對象,我認爲是關鍵的,或者至少.NET定義的屬性)。

我猜c#委託不能以單線程方式工作 - 但是,在閱讀c#文檔時我沒有找到這個事實。

(一種解決方案是通過.NET Dispatcher類和invoke(),但似乎過於武斷和可能慢 - 沒有任何更多的WPF友好的方式?)

  • 我曾讀過關於路由事件和DependencyProperties

WPF文檔中的(但是had't尚未測試這一點),但似乎路由事件不能幫助(因爲我類不是的VisualTree的一部分)和我should't從DependencyObject繼承。

我閱讀(我想)與我的問題有關的一切。如果問了一些類似的問題,我很抱歉,如果問題的本質是相同的,我會很高興你能指引我。

簡單的例子:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Controls; 
using System.Windows.Media; 
using System.Timers; 

namespace WpfApplication4 
{ 
    internal class Rect:ContentControl 
    { 
     Inner inner = new Inner(); 

     public Rect() 
     { 
      inner.Rotate += new Inner.RotateEventHandler(rotated); 
     } 

     public void rotated(object sender, RotateEventArgs args) 
     { 
      Background = Brushes.Blue;       //Run time error 
      VisualTransform = new RotateTransform(args.Angle); //Run time error 
     } 
    } 

    public class Inner 
    { 
     Timer timer = new Timer(200); 

     public Inner() 
     { 
      timer.Enabled = true; 
      timer.Elapsed +=new ElapsedEventHandler(elapsed); 
     } 

     public delegate void RotateEventHandler(object sender, RotateEventArgs args); 
     public event RotateEventHandler Rotate; 

     public void elapsed(object sender, ElapsedEventArgs e) 
     { 
      RotateEventArgs args = new RotateEventArgs(); 
      args.Angle = args.Angle + 45; 
      OnRotate(args); 
     } 

     protected void OnRotate(RotateEventArgs e) 
     { 
      if (e != null) 
      { 
       Rotate(this, e); 
      } 
     } 
    } 

    internal class RotateEventArgs 
    { 
     private double angle = 0; 

     public double Angle 
     { 
      set { angle = value; } 
      get { return angle; } 
     } 
    } 
} 

回答

0

您可以使用DispatchTimer代替Timer。在Rect類本身中有DispatchTimer

+0

超級!感謝您的答覆。它的工作原理:) –

+0

你能接受答案嗎? – anivas

相關問題