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,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay,TargetNullValue=0}" TextWrapping="NoWrap" MaxLength="10"/>

4.在调用外部硬件进行检测等情况下,考虑对调用类进行加锁,否则可能存在重复调用导致崩溃等问题。

5.界面控件while(true)时,记得在里面Sleep(1)。另外加载gif图片时,XamlAnimatedGif在部分配置一般的机器上(cpu为G3260),操作系统为win7时,可能会增加CPU负荷,导致卡顿,可以采用MediaElement方式。XamlAnimatedGif在大部分情况下更优,只是在此特种情况下可能存在CPU渲染增高后难以降下来,导致卡顿。而MediaElement多出来的一点点内存占用则影响甚微。

6.在TabItem里面的TextBox,在切换到当前Tab页时,TextBox会获取到焦点,也就是可能触发获取焦点事件逻辑,如果不想切换时默认获取到焦点,而是手动点击时获取到焦点,可以设置 TextBox的属性IsTabStop="False"。

7.使用VisualTreeHelper获取控件模板中的子控件属性,并设置该子控件属性值时,可能存在第一次获取不到的情况,原因是第一次页面未加载就去获取,而样式里面的模板是后加载的。这种情况可以在模板中绑定本控件的属性,使其关联起来,如下:

                <Button x:Name="BTN_NextPage" Content="下一页" Background="#0483E5" Click="BTN_NextPage_Click" >
                    <Button.Template>
                        <ControlTemplate TargetType="Button">
                            <Border x:Name="img" Background="{Binding ElementName=BTN_NextPage,Path=Background}" CornerRadius="25">
                                <Label  Content="{TemplateBinding Content}" FontFamily="微软雅黑" FontSize="22" FontWeight="Regular" Foreground="#ffffff" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsPressed" Value="True">
                                    <Setter TargetName="img" Property="Background" 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,就在资源中处理这部分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值