Wtf(暂时命名,随便起的 =
_=),模仿WPF的框架,还没有完善,只有简单的基础元素,支持数据绑定。虽然支持mono但是mono有bug

 
关于这类问题网上搜索会有很多解决方案,但基本的意思都相差不大,大致问题出于启用线程时调用类似剪贴板Clipboard.SetDataObject出错,我把我的测试代码展现下:

电视精灵

写这个只是兴趣爱好,感觉也没多大意义了,如果这个UI框架完善了,有多少人愿意用?毕竟Windows上有WPF,而且C#跨平台需求也不多啊。我对WPF也不算熟悉,要完善的话,还有很多要写。一大堆常用控件和设计器。不过我不用XML来描述,而是直接用C#来定义,设计器直接生成C#代码,因为我觉得,如果有强大的设计器,写XML就是多余的,而且解析XML还影响性能,对于WPF,我觉得Xaml太啰嗦了。

图片 1

效果展示

 

 
解决方案:只需将thread.SetApartmentState(ApartmentState.STA);反注释就可以了。

该项目主要练习xml文件解析和面向对象思维;

WtfObject 
相当于WPF里的DependencyObject依赖对象。继承该类的对象,所有属性默认都是依赖属性

  出现的原因:

1.电视台和节目信息都要从xml文件中解析,并绑定;

属性写法:

*  单元是进程内部具有相同线程访问要求的对象的逻辑容器。同一单元中的所有对象都可以接收从该单元中的任何线程发出的调用。
.NET Framework
不使用单元,托管对象自己负责以线程安全的方式使用所有共享资源。由于 COM
类使用单元,因此公共语言运行
库需要在 COM interop 的情况下调用 COM
对象时创建并初始化一个单元。托管线程可以创建并进入只允许有一个线程的单线程单
元 (STA) 或者包含一个或多个线程的多线程单元 (MTA)。通过将线程的
ApartmentState 属性设置为 ApartmentState 枚举值之一
,可以控制所创建的单元的类型。由于给定线程只能初始化 COM
单元一次,因此在第一次调用非托管代码之后就不能更改单元类型。*

2.实现点击电视频道节点显示该频道的电视节目信息;

 

注:在网络上找了两篇文章或许更能说明这个问题。文章的大意是,由于很多COM在.NET环境下如果使用多线程的话,会导致引用的COM不能正常运行,
而如果不声明程序为STAThread的话,.NET就会自动使用多线程来提高效率,这样就会导致不可预知的后果。

3.当时间到达用户设置的节目提醒时间后弹出窗口提醒用户节目即将开始;

        /// <summary>
        /// 绑定的数据上下文
        /// </summary>
        [UIPropertyMetadata(null, true)]
        public virtual object DataContext
        {
            get { return GetValue<object>(); }
            set { SetValue(value); }
        }

  A young ilder ~ an old beggar !

效果演示

 

1.点击频道显示该频道的节目信息

属性上的特性可以是 PropertyMetadata或者UIPropertyMetadata
中的一个,默认值可以通过这两个特性来设置。如果不加这两个特性,那默认值就是null或者0

图片 2

如果是复杂属性类型默认值,可以通过重写 OnOverrideMetadata 来设置

 2.选中全部电视台下的节点,右键显示右键菜单‘添加到我的电视台’;

 

图片 3

       protected override void OnOverrideMetadata(OverrideMetadata overridePropertys)
       {
            base.OnOverrideMetadata(overridePropertys);
            overridePropertys.Override("StrokeStyle", new UIPropertyMetadataAttribute(new Stroke(1), false, false, true));
        }

 3.选中我的电视台下的节点,右键显示右键菜单‘删除’;

 

 图片 4

 

 4:右键电视节目信息显示设置提醒

数据绑定:

图片 5

var bind = label["Text"] <= "Test";//右到左数据绑定,数据源是DataContext的属性

var bind = label["Text"] >= "Test";//左到右数据绑定,数据源是DataContext的属性

var bind = label["Text"] != "Test";//右到左数据绑定,只传递一次 ,数据源是DataContext的属性

var bind = label["Text"] == "Test";//双向绑定,数据源是DataContext的属性,双向绑定需要对象实现INotifyPropertyChanged



var bind = label["Text"] <= button["Test"];//右到左数据绑定

var bind = label["Text"] >= button["Test"];//左到右数据绑定

var bind = label["Text"] != button["Test"];//右到左数据绑定,只传递一次

var bind = label["Text"] == button["Test"];//双向绑定

5.点击提醒管理显示提醒窗体,右键提醒信息显示删除

 

图片 6

 

xml文件

发表评论

电子邮件地址不会被公开。 必填项已用*标注