【问题标题】:non-WPF instance callback to a WPF-Control derived class. Change DependencyProperty对 WPF-Control 派生类的非 WPF 实例回调。更改依赖属性
【发布时间】:2011-07-18 10:21:22
【问题描述】:
  1. WPF 控件派生类具有非 WPF 控件派生类的组合。后一个类,比如 Inner,应该触发 Outer 类 WPF DependencyProperty 更改。

  2. 基本不变量是 我的 Inner 类不应强制使用任何 WPF 命名空间,而 Inner 是 API 的一部分我正在创建的一个 dll。所以从任何 WPF 类继承都不是合适的解决方案。

实现从非 .NET 派生类到 WPF-Control 类的回调以更改 DependencyProperty 对象的最佳(或至少是任意)方法是什么。

发现了一些假设的回调机制:

  • c# 委托和 c# 事件

无法解决这个问题,因为它引发了运行时异常

The calling thread cannot access this object because a different thread owns it.

当回调机制试图修改 Background 属性时(我认为 DependancyProperty 对象是关键,或者至少是 .NET 定义的属性)。

我猜想 c# 委托不能以单线程方式工作 - 但是,我在阅读 c# 文档时没有发现这个事实。

(一种解决方案是通过 .NET Dispatcher 类和 Invoke(),但它似乎太随意而且可能很慢 - 是不是更适合 WPF 的方式?)

  • 我读过路由事件和依赖属性

在 WPF 文档中(但尚未对此进行测试),但似乎路由事件无济于事(因为我的 Inner 类不是 VisualTree 的一部分)并且我不应该从依赖对象。

我阅读(我想)与我的问题相关的所有内容。如果有人问过类似的问题,我很抱歉,如果问题本质相同,如果您将我引导到该线程,我会很高兴。

简化示例:

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; }
        }
    }
}

【问题讨论】:

    标签: wpf callback wpf-controls dependency-properties


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多