WPF 开发技巧

自定义高性能无边框窗体

引入Microsoft.Windows.Shell。可参考 WPF Custom Chrome Library 和  MSDN WindowChrome Class 有相关自定义窗口实现。

参考:https://www.cnblogs.com/fishpond816/p/14299208.html

 

MVVM模式

参考:https://www.cnblogs.com/fishpond816/p/13467435.html

 

WPF 进程间传递参数

/***************************
* 启动附程序时传递参数
* Process.Start(exePath,"测试字符串");
* 
* 附程序使用 Application_Startup 接收参数
*/
private void Application_Startup(object sender, StartupEventArgs e)
{
    if (e.Args.Length == 1)
    {
        this.Properties["Test"] = e.Args[0];
    }
}

WPF CommandParameter 传参

使用控件本身作为参数

CommandParameter="{Binding RelativeSource={RelativeSource Self}}"

使用当前窗口作为参数

CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}}"

当前DataContext对象

CommandParameter="{Binding UserName}"
Binding 
Text="{Binding UserName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"

空白汉字占位符,  表示一个汉字占位符

<TextBlock xml:space="preserve" Text="备&#12288;&#12288;注" />

 

绑定元素

<ProgressBar x:Name="progressBar"/>
<Label Content="{Binding ElementName=progressBar,Path=Value}" ContentStringFormat="{}{0:P2}"/>

  

绑定属性

<Label Content="{Binding Path=Result,Mode=TwoWay}"/>

  

Binding后台实现

Binding binding = new Binding();
binding.Source = System.Diagnostics.Process.GetCurrentProcess();
binding.Path = new PropertyPath("ProcessName");
binding.Mode = BindingMode.OneWay;
txtOne.SetBinding(TextBlock.TextProperty,binding);

 

绑定列表

ObservableCollection<Object> infos = new ObservableCollection<Object>();

如果想对于对象属性修改也通知到UI,需要类实现INotifyPropertyChanged接口

 

异步更改UI

Action action = () => { };
Application.Current.Dispatcher.Invoke(action);
Application.Current.Dispatcher.BeginInvoke(action);

  

绑定注意细节
数据源初始化不要为null
数据源实例化之后不要再次实例化

posted @ 2021-05-13 01:01  microsoft-zhcn  阅读(125)  评论(0编辑  收藏  举报