2011-07-18 13 views
2
  1. WPFコントロールの派生クラス非WPFコントロールの派生クラスの組成を有しています。後者のクラス、たとえばInnerは、OuterクラスのWPF DependencyPropertyの変更をトリガーする必要があります。WPF-Control派生クラスへの非WPFインスタンスコールバック。変更したDependencyProperty

  2. エッセンシャル不変はインナークラスはインナーは私が作成していたDLLのAPIの一部であることによって、を使用するために、任意のWPF名前空間を強制してはならないということです。したがって、WPFクラスからの継承は適切な解決策ではありません。たDependencyPropertyオブジェクトを変更するWPF-Controlクラスにnon-.NET派生クラスからのコールバックを実装するための最良の(または少なくともarbitraty)方法かもしれない何

。見つかっ

いくつかの仮定のコールバックメカニズム:

  • C#のデリゲートとC#のイベント。それは実行時例外
    The calling thread cannot access this object because a different thread owns it. 
    

    コールバックメカニズムは、Backgroundプロパティを変更しようと

    を投げられるbecouce

は、この問題を解決することはできません(私が思うDependancyPropertyオブジェクトがキーである、または少なくとも.NET定義されたプロパティ)。

私は、C#デリゲートはシングルスレッド方式では動作しないと思いますが、C#ドキュメントを読んでいるうちにこの事実は見つかりませんでした。

(一つの解決策は、.NETディスパッチャクラスと呼び出し()を介してであるが、それはあまりにも恣意的で、おそらく遅いようだ - それ以上の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

関連する問題