当前位置: 首页 > news >正文

山东高端网站建设wang网络营销与直播电商

山东高端网站建设wang,网络营销与直播电商,做内贸的有哪些网站,游戏开服网前面的文章我们提及过,异步UI的基础实现。基本思路主要是开启新的UI线程,并通过VisualTarget将UI线程上的Visual(即RootVisual)连接到主线程上的UI上即可渲染显示。 但是,之前的实现访问是没有交互能力的,视觉树上的UI并不能实现…

前面的文章我们提及过,异步UI的基础实现。基本思路主要是开启新的UI线程,并通过VisualTarget将UI线程上的Visual(即RootVisual)连接到主线程上的UI上即可渲染显示。

但是,之前的实现访问是没有交互能力的,视觉树上的UI并不能实现鼠标事件。那么今天我们就把交互的工作也给完成了。

实现交互能力的核心在于PresentationSource,它是完成交互功能的核心。它提供了交互源,它是一个抽象类,不能直接使用。我们需要通过继承它来实现交互逻辑。

具体代码如下:

 public class VisualTargetPresentationSource : PresentationSource{public VisualTargetPresentationSource(HostVisual hostVisual){_visualTarget = new VisualTarget(hostVisual);}public override Visual RootVisual{get{return _visualTarget.RootVisual;}set{Visual oldRoot = _visualTarget.RootVisual;_visualTarget.RootVisual = value;//此处是关键代码,通过根的时间通知,触发Load事件。通知视觉树,元素已经加载。//元素加载后,IsVisible会变成True,命中测试才能开始工作RootChanged(oldRoot, value);}}public override bool IsDisposed{get{return false;}}protected override CompositionTarget GetCompositionTargetCore(){return _visualTarget;}private VisualTarget _visualTarget;}

有了上述代码,我们的异步UI具备了交互能力。但是此时,我们用鼠标点击元素,依然是不会有动作发生的。

因为我们的UI是在异步线程上,它的功能受到一定的阉割,它并不能直接响应鼠标或者键盘事件。所以我们需要通过VisualHost来做路由事件的传递。

请看完整的示例:

//异步UI容器public class AsyncUIContainer : UIElement{public AsyncUIContainer(){Initialize();}private HostVisual hostVisual;private Grid RootVisual;private DispatcherUIThread dispatcherUIThread;/// <summary>/// /// </summary>private void Initialize(){hostVisual = new HostVisual();dispatcherUIThread = new DispatcherUIThread();dispatcherUIThread.Start();dispatcherUIThread.Dispatcher.Invoke(() =>{RootVisual = new Grid();new VisualTargetPresentationSource(hostVisual){RootVisual = RootVisual};});AddVisualChild(hostVisual);}public void UpdateRootLayout(Action<Grid> action){if (action != null){RootVisual.Dispatcher.Invoke(() =>{action(RootVisual);});}}#region overrideprivate UIElement _hitElement;protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters){RootVisual.Dispatcher.Invoke(() =>{_hitElement = (UIElement)RootVisual.InputHitTest(hitTestParameters.HitPoint);});if (_hitElement != null){return new PointHitTestResult(this, hitTestParameters.HitPoint);}else{return null;}}//此处是用来做路由事件转发,用于触发UI线程上的元素事件protected override void OnMouseDown(MouseButtonEventArgs e){base.OnMouseDown(e);if (_hitElement != null){_hitElement.Dispatcher.Invoke(() => _hitElement.RaiseEvent(e));}}//重写布局系统,让多线程UI元素能正常布局protected override Size MeasureCore(Size availableSize){if (availableSize.Height > 0 && availableSize.Width > 0 && !(double.IsInfinity(availableSize.Height) || double.IsInfinity(availableSize.Width))){RootVisual.Dispatcher.Invoke(() =>{RootVisual.Measure(availableSize);});return availableSize;}else{var minSize = new Size(200, 200);RootVisual.Dispatcher.Invoke(() =>{RootVisual.Measure(minSize);                  });return minSize;}}//重写布局系统,让多线程UI元素能正常布局protected override void ArrangeCore(Rect finalRect){base.ArrangeCore(finalRect);RootVisual.Dispatcher.Invoke(() =>{RootVisual.Arrange(finalRect);});RenderSize = finalRect.Size;}//指定起Visual的数量protected override int VisualChildrenCount => 1;//指定需要渲染的Visual对象protected override Visual GetVisualChild(int index){return hostVisual;}public void Dispose(){dispatcherUIThread?.Dispose();}#endregionpublic class VisualTargetPresentationSource : PresentationSource{public VisualTargetPresentationSource(HostVisual hostVisual){_visualTarget = new VisualTarget(hostVisual);}public override Visual RootVisual{get{return _visualTarget.RootVisual;}set{Visual oldRoot = _visualTarget.RootVisual;_visualTarget.RootVisual = value;RootChanged(oldRoot, value);}}public override bool IsDisposed{get{return false;}}protected override CompositionTarget GetCompositionTargetCore(){return _visualTarget;}private VisualTarget _visualTarget;}}

到这里,你就可以愉快的玩耍了。下期我们再实现异步UI在XAML上的编辑能力,可以在xaml中添加普通的xaml代码一样简单使用。

http://www.ds6.com.cn/news/59090.html

相关文章:

  • 健康门户网站建设怎么制作网页广告
  • wordpress批量读取excel谷歌seo优化中文章
  • 网站是什么字体佛山优化网站关键词
  • 昆明专业的网站制作建设太仓seo网站优化软件
  • 筑巢做网站怎么样阿里巴巴指数查询
  • 网站设计合同seo入门基础教程
  • 传奇世界网页版在线玩南宁排名seo公司
  • 哪些网站可以做视频搬运网站制作专业
  • 开发网站的技术风险搜索引擎优化的英语简称
  • 学校网站建设计划书查权重工具
  • 做市场的逛的网站手机百度识图网页版入口
  • 关于做网站的百度app打开
  • 深圳网站建设公司哪里好网站模板及源码
  • 科技企业网站源码网站域名备案查询
  • ps企业网站模板免费下载最好的免费建站网站
  • 外贸网站推广建设百度相册登录入口
  • 免费网站建设系统优化大师
  • 作品展示的网站seo快速工具
  • 十大搜索引擎排名宁波seo网站推广
  • 手机微信网站怎么做的百度seo不正当竞争秒收
  • 长春做网站seo买卖友链
  • 东莞网站建设设计重庆seo研究中心
  • 小白如何做网站近期时政热点新闻20条
  • 做网站可以提些什么意见百度竞价返点一般多少
  • 网站建设的目标定位百度搜索网页版入口
  • wordpress可以制作什么网站微信小程序开发文档
  • c#+开发网站开发怎样留别人电话在广告上
  • 网站建设中源码编程同样重要找网站设计公司
  • 企业网站建设报价清单厦门seo搜索排名
  • 百度网站建设汕头网站建设方案优化