.Net Framework

WPF 两个 Topmost 的窗口如何设置谁在最上方

泄露秘密 提交于 2020-08-19 04:17:39
我需要有两个层级最高的窗口,但是要求某个窗口在另一个的上方,同时这两个窗口在所有其他的应用程序窗口的上方 需要用到 SetWindowLong 的 win32 方法的设置,假设我有 A 和 B 两个窗口,我需要让这两个窗口都是 Topmost 同时 A 在 B 的上方 大概逻辑如下 B.Loaded += (sender, args) => { A.Topmost = false; A.Topmost = true; B.Dispatcher.InvokeAsync(() => { Win32.User32.SetWindowLongPtr(new WindowInteropHelper(A).Handle, Win32.GetWindowLongFields.GWL_HWNDPARENT, new WindowInteropHelper(B).Handle); }); }; 为什么需要在 B 的 Loaded 之后,原因是为了窗口实际创建出来,拿到句柄 为什么还需要做延迟一拍设置,因为立刻设置可能和控件初始化冲突,如 Popup 刚好弹出,将不会收起。注意这是在一个特别复杂的项目里面才发现这个坑,我创建空白项目没有发现这个坑 这里的 SetWindowLongPtr 是 SetWindowLong 方法,只是封装了 x86 和 x64 的代码 关于 GWL_HWNDPARENT

.NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)

和自甴很熟 提交于 2020-08-19 04:17:14
阅读目录: 1.需求背景介绍(Model元数据设置项应该与View绑定而非ViewModel) 1.1.确定问题域范围(可以使用DSL管理问题域前提是锁定领域模型) 2.迁移ViewModel设置到外部配置文件(扩展Model元数据提供程序) 2.1.实现元数据提供程序(简单示例) 1.需求背景介绍(Model元数据设置项应该与View绑定而非ViewModel) 使用ASP.NETMVC构建普通的中小型站点可以使用简单的Model元数据设置方式来控制ViewModel如何显示在View中,但是复杂的应用场景不会这么简单的就能完成;大型站点的ViewModel的体积非常大,真的大的超乎我们的想象(当然这里面有历史原因),这么大的一个显示实体我们需要在不同的页面中呈现它会非常的棘手;然而小型站点不太会遇见ViewModel在几十个页面中显示的情况出现,一般页面也就是几十个差不多了; 在大型电子商务应用中,UI层的一个ViewModel不仅用来呈现数据还充当着与远程SOA接口通讯的DTO作用,如果为了结构清晰完全可以将ViewModel与DTO分开,但是有时候我们确实需要考虑额外的性能开销(有时候我们只能接受历史遗留的问题,技术债务累积多久就要还多久); 这篇文章将讲解如何利用ASP

WPF 中如何绑定附加属性?XAML 中记得加括号,C# 中记得不能用字符串

只愿长相守 提交于 2020-08-19 03:21:04
在 XAML 中写绑定是 WPF 学习的必修课,进阶一点的,是用 C# 代码来写绑定。然而一旦绑定的属性是附加属性,好多小伙伴就会开始遇到坑了。 本文将介绍如何在 XAML 和 C# 代码中绑定附加属性。 @ TOC 背景代码 开始遇到这个问题的背景是我定义了一个附加属性,然后试图通过绑定的方式完成一些业务。 用附加属性来完成的很大一个好处在于不需要改动原有的代码破坏原来的类。例如我只需要在任何一个类中定义 IsDraggable 附加属性,就可以让我其他地方的 Grid Button 等支持拖拽。 public class DraggableElement : FrameworkElement { static TabViewItem() { DefaultStyleKeyProperty.OverrideMetadata(typeof(DraggableElement), new FrameworkPropertyMetadata(typeof(DraggableElement))); } public static readonly DependencyProperty IsDraggableProperty = DependencyProperty.RegisterAttached( "IsDraggable", typeof(bool), typeof

如何在.NET(特别是C#)中对对象进行深层复制? [重复]

痞子三分冷 提交于 2020-08-19 01:02:04
问题: This question already has answers here : 这个问题已经在这里有了答案 : Deep cloning objects (45 answers) 深度克隆对象 (45个答案) Closed 5 years ago . 5年前 关闭。 I want a true deep copy. 我想要一个真正的深复制。 In Java, this was easy, but how do you do it in C#? 在Java中,这很容易,但是如何在C#中实现呢? 解决方案: 参考一: https://stackoom.com/question/Xev/如何在-NET-特别是C-中对对象进行深层复制-重复 参考二: https://oldbug.net/q/Xev/How-do-you-do-a-deep-copy-of-an-object-in-NET-C-specifically-duplicate 来源: oschina 链接: https://my.oschina.net/u/4438370/blog/4423216

web前端开发的工资如何?都要学习哪些技术?

我怕爱的太早我们不能终老 提交于 2020-08-19 01:00:41
  并不是所有人都是985、211毕业,学历低的人一样要生活、要工作,那我今天就跟大家分享一些建议。Web前端工程师不但薪资高,也是目前国内最紧缺的岗位。很多人都想转web前端开发。下面就来给大家介绍一下web前端开发需要学习的技术,以及薪资如何?   Web前端的职能   Web前端工程师其实在不同的公司,有不同的职能,但是称呼都是类似的。   做网站设计、网页界面开发   做网页界面开发   做网页界面开发、前台数据绑定和前台逻辑的处理(我是属于这种的)   设计、开发、数据   Web前端的核心技术   1 基础技术   前端的三大基础毫无疑问就是HTML、CSS和JS。   HTML。HTML,翻译过来就是超文本标记语言,而不是江湖上的HOW TO ML。方向不能搞错了,我们整的东西可是老少咸宜的。HTML学习最重要的标签的学习,div、h1-h6、p、ul-li、strong、图片、字体等,什么内容用什么框.   CSS。CSS定义了HTML标签的显示外观,气质。主要掌握浮动,宽高设置、显示属性等   Javascript。这是运行在浏览器上的脚本,但是现在javascript已经远远不是当年的那个js了,尤其Ecmascript6标准出来后,nodeJS 横空出世,JS暴露出一统天下的野心,JS让网页变得灵活,其实现的每一个明里暗里的交互,其实是为了触及您的灵魂

Citrix虚拟桌面小技巧篇之二虚拟桌面优化

ⅰ亾dé卋堺 提交于 2020-08-19 00:51:44
日拱一卒无有尽,功不唐捐终入海。 宁可十年不将军,不可一日不拱卒。 关于虚拟桌面,在构建Gold Image时,需要做哪些优化,通过本文做一些简单的总结。 本文所说的所有优化都是针对Windows 10. 基于文档的优化 关于Windows 10的优化,可以参考如下链接:Windows 10 Optimization Guide https://support.citrix.com/article/CTX216252 在该手册里,主要提供了如下优化: 移除非必须的应用程序 Scheduled Task Considerations Microsoft CEP优化 安全 Maintenance Optimization Protection HDX优化 系统和用户的优化 用户体验的优化 基于WAN的优化 Printing from non-Windows end points 整个文档共计19页,英文版,全部的优化步骤相对还是比较复杂的。 基于工具的优化-Citrix Optimizer Citrix Optimizer提供了一种图像界面的优化工具,可以帮助工程师优化系统环境,尤其是包含Citrix VDA的操作系统,该工具基于Poweshell编写。 下载地址:https://support.citrix.com/article/CTX224676 最新版本: May 21,

c#多线程总结(纯干货)

我们两清 提交于 2020-08-19 00:49:01
线程基础 创建线程 static void Main( string [] args) { Thread t = new Thread(PrintNumbers); t.Start(); // 线程开始执行 PrintNumbers(); Console.ReadKey(); } static void PrintNumbers() { Console.WriteLine( " Starting... " ); for ( int i = 1 ; i < 10 ; i++ ) { Console.WriteLine(i); } } View Code 暂停线程 class Program { static void Main( string [] args) { Thread t = new Thread(PrintNumbersWithDelay); t.Start(); PrintNumbers(); Console.ReadKey(); } static void PrintNumbers() { Console.WriteLine( " Starting... " ); for ( int i = 1 ; i < 10 ; i++ ) { Console.WriteLine(i); } } static void PrintNumbersWithDelay() {

.Net core+Reds如何实现Aop缓存

匆匆过客 提交于 2020-08-18 23:28:37
.Net core+Reds如何实现Aop缓存 前言 在实际开发的场景中,有很多需要缓存的数据,为了减少重复代码的编写,想采用Aop的方式来实现切面编程减少对以有业务代码的改动和侵入性。 在传统的 .Net Framework项目中实现Aop有很多简单的方式,但是在 .Net Core中尤其是1.X版本笔者没有找到比较好的解决方案采用了一个三方开源的Aop库,下面会写出来。 准备 本次采用的环境是 .Net Core 1.1版本 本次使用的Aop 开源库是 AspectCore 0.1.2版本 实践 Aop顾名思义面向切面编程,是一种通过预编译和运行时动态代理来实现的一种技术,本文中采用了三方开源的Aop库 AspectCore 是.Net Core 中一个轻量级和模块化的Aop 解决方案 首先创建一个 缓存特性 CacheAttribute 继承 AspectCore中的 InterceptorAttribute并且重写 InterceptorAttribute中的 Invoke方法 代码 如下 1 public async override Task Invoke(AspectContext context, AspectDelegate next) 2 { 3 try 4 { 5 // 用方法名称+入参 生成Key 6 string key = context.Proxy

在运行时生成C# .NET类

半城伤御伤魂 提交于 2020-08-18 21:51:26
​本文译自​:​ Generating C# .NET Classes at Runtime 作者:WedPort 在我的C#职业生涯中,有几次我不得不在运行时生成新的类型。希望把它写下来能帮助有相同应用需求的人。这也意味着我以后不必在查找相同问题的StackOverflow文章了。我最初是在.NET 4.6.2中这样做的,但我已经更新到为.NET Core 3.0提供了示例。所有代码都可以在我的GitHub上面找到。 GitHub: https://github.com/cheungt6/public/tree/master/ReflectionEmitClassGeneration 为什么我需要在运行时生成类? 在运行时生产新类型的需求通常是由于运行时才知道类属性,满足性能要求以及需要在新类型中添加功能。当你尝试这样做的时候,你应该考虑的第一件事是:这是否真的是一个明智的解决方案。在深入思考之前,还有很多其他事情可以尝试,问你自己这样的问题: 我可以使用普通的类吗 我可以使用Dictionary、Tuple或者对象数组(Array)? 我是否可以使用扩展对象 我确定我不能使用一个普通的类吗? 如果你认为这仍然是必要的,请继续阅读下面的内容。 示例用例 作为一名开发人员,我将大量数据绑定到各种WPF Grids中。大多数时候属性是固定的,我可以使用预定义的类。有时候

【微信小程序】springboot后台获取用户的openid

徘徊边缘 提交于 2020-08-18 21:34:19
openid可以标识一个用户,session_key会变,所以来获取一下openid。 openid不能在微信小程序中直接获取,需要后台发送请求到微信的接口,然后微信返回一个json格式的字符串到后台,后台处理之后,再返回到微信小程序。 发布的小程序需要https的域名,而测试的时候可以使用http。 小程序在app.js中,修改login()中的内容: // 登录 wx.login({ success: res => { // 发送 res.code 到后台换取 openId, sessionKey, unionId if (res.code) { wx.request({ url: 'http://localhost:84/user/login' , method: 'POST' , data: { code: res.code }, header: { 'content-type': 'application/x-www-form-urlencoded' }, success(res) { console.log( "openid:"+ res.data.openid); if (res.data.openid != "" || res.data.openid!= null ){ // 登录成功 wx.setStorageSync("openid", res.data