Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对WPF控件派生类的非WPF实例回调。更改从属属性_Wpf_Callback_Wpf Controls_Dependency Properties - Fatal编程技术网

对WPF控件派生类的非WPF实例回调。更改从属属性

对WPF控件派生类的非WPF实例回调。更改从属属性,wpf,callback,wpf-controls,dependency-properties,Wpf,Callback,Wpf Controls,Dependency Properties,WPF控件派生类具有非WPF控件派生类的组合。后一个类(比如内部类)应该触发外部类WPF DependencyProperty更改 本质不变量是,我的内部类不应强制使用任何WPF名称空间,因为内部是我正在创建的dll的API的一部分。因此,从任何WPF类继承都不是合适的解决方案 实现从非.NET派生类到WPF控制类的回调以更改DependencyProperty对象的最佳或至少是仲裁方式是什么 发现了一些假设的回调机制: c代表和c事件。 无法解决此问题,因为它引发了运行时异常 The call

WPF控件派生类具有非WPF控件派生类的组合。后一个类(比如内部类)应该触发外部类WPF DependencyProperty更改

本质不变量是,我的内部类不应强制使用任何WPF名称空间,因为内部是我正在创建的dll的API的一部分。因此,从任何WPF类继承都不是合适的解决方案

实现从非.NET派生类到WPF控制类的回调以更改DependencyProperty对象的最佳或至少是仲裁方式是什么

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

c代表和c事件。 无法解决此问题,因为它引发了运行时异常

The calling thread cannot access this object because a different thread owns it.
当回调机制试图修改后台属性时,我认为DependencyProperty对象就是键,或者至少是.NET定义的属性

我猜c委托不是以单线程方式工作的——然而,我在阅读c文档时没有发现这一事实

一种解决方案是通过.NET Dispatcher类和Invoke,但它似乎太武断,而且可能很慢——这难道不是WPF更友好的方式吗

我读过关于路由事件和从属属性的文章 然而,在WPF文档中,我还没有测试过这一点,但似乎RoutedEvent帮不上忙,因为我的内部类不是VisualTree的一部分,我不应该从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; }
        }
    }
}
您可以使用而不是计时器。将DispatchTimer放在Rect类本身中。

您可以使用代替计时器。将DispatchTimer放在Rect类本身中