WPF控制派生類具有非WPF控制派生類的組合物。後一類,說內部,應該觸發外部類WPF的DependencyProperty更改。對WPF控件派生類的非WPF實例回調。變化的DependencyProperty
基本不變的是,我的內蒙古類不應強迫任何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; }
}
}
}
超級!感謝您的答覆。它的工作原理:) –
你能接受答案嗎? – anivas