尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

多年WPF开发经验点

多年WPF开发经验点 1.更改命令空间后g.i.cs文件无法覆盖导致编译没法通过可以通过设置App.xaml文件的属性中的生成操作(Build Action)实际通过改为Page后再改回ApplicationDefinition即解决了此问题。2.获取焦点问题如果直接用Focus()可能在第一次调用没有生效那么可以采用另一种方式Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Render, new Action(() pwdBoxPWD.Focus()));另一个情况是在第一次构造后(如load方法内)给某个控件focus后后续再行调用focus就没有问题了。3.在层级绑定的情况下例如某个对象下的list集合中对象的字段绑定到TextBox有可能没有触发该字段属性的值发生变更那么可以尝试在绑定中指定UpdateSourceTrigger具体深层次原因不清除实测添加后就阔以了。如下TextBox Text{Binding SaleSeatNum,UpdateSourceTriggerPropertyChanged,ModeTwoWay,TargetNullValue0} TextWrappingNoWrap MaxLength10/4.在调用外部硬件进行检测等情况下考虑对调用类进行加锁否则可能存在重复调用导致崩溃等问题。5.界面控件while(true)时记得在里面Sleep(1)。另外加载gif图片时XamlAnimatedGif在部分配置一般的机器上(cpu为G3260)操作系统为win7时可能会增加CPU负荷导致卡顿可以采用MediaElement方式。XamlAnimatedGif在大部分情况下更优只是在此特种情况下可能存在CPU渲染增高后难以降下来导致卡顿。而MediaElement多出来的一点点内存占用则影响甚微。6.在TabItem里面的TextBox在切换到当前Tab页时TextBox会获取到焦点也就是可能触发获取焦点事件逻辑如果不想切换时默认获取到焦点而是手动点击时获取到焦点可以设置 TextBox的属性IsTabStopFalse。7.使用VisualTreeHelper获取控件模板中的子控件属性并设置该子控件属性值时可能存在第一次获取不到的情况原因是第一次页面未加载就去获取而样式里面的模板是后加载的。这种情况可以在模板中绑定本控件的属性使其关联起来如下Button x:NameBTN_NextPage Content下一页 Background#0483E5 ClickBTN_NextPage_Click Button.Template ControlTemplate TargetTypeButton Border x:Nameimg Background{Binding ElementNameBTN_NextPage,PathBackground} CornerRadius25 Label Content{TemplateBinding Content} FontFamily微软雅黑 FontSize22 FontWeightRegular Foreground#ffffff HorizontalAlignmentCenter VerticalAlignmentCenter/ /Border ControlTemplate.Triggers Trigger PropertyIsPressed ValueTrue Setter TargetNameimg PropertyBackground Value#efc08b/ /Trigger /ControlTemplate.Triggers /ControlTemplate /Button.Template /Button此时后台代码设置该控件的Background就能更改其模板下面的子控件Background属性值了即便是第一次也可以。8.dotnetCampus.Ipc 库就包含源代码生成器需要此场景的时候可以查看该库的使用。9.对于部分新项目存在Directory.Build.Props文件的可以去掉里面的Version和AssemblyVersion否则项目下的程序集会被统一打版本10.使用多级模板慎重这可能会导致IStyleConnector.Connect error报错出现编译通过而运行有问题绑定不了事件的情况。也要当心多级模板中下级模板套多个TemplatedParent绑定引发问题。实测在ItemsControl.ItemTemplate –DataTemplate–TemplatedParent–TemplatedParent … – CheckBox– CheckBox.ControlTemplate– ListBox– ListBox.ControlTemplate去掉TemplatedParent 后正确。如果最后还有一层DataTemplate也将报错此时网上找到一个方式将内部模板移动到资源例如最后是–ListBox.ItemTemplate –DataTemplate就在资源中处理这部分。11.ListView可以进行分组并可绑定显示组名称其组名称的来源等于该组内所有数据项在“分组依据属性”上的共同值。如果你按“姓氏首字母”分组那么 A 组的 Name 就是A。如果你按“城市”分组那么北京组的 Name 就是北京。但是注意规避非UI线程的更新简单来说就是Application.Current.Dispatcher.Invoke否则容易觉得bug很奇怪12.WPF 默认最后一个窗口关闭应用即退出即便Application.Current.MainWindow new MainWindow()了一个新窗体再马上显示都来不及这是因为新窗口来不及作为“运行中的已打开窗口”维持进程整个应用随之结束。通常出现在启动时只有一个窗体还要关闭窗体容易引发问题例如打开的窗体只有一个登录窗体时。
返回列表