CPF 入门教程

摘要:
ShadowColor提供阴影设置。Button继承自ContentControlContent属性,可用于设置字符串。直接在设计器中添加图标和文本控件组。CheckBoxContent属性可用于设置字符串。IsChecked定义RadioButtonContent属性可用于在选定状态下设置字符串。true)]//绑定RadioButton组的值。

CPF C#跨平台桌面UI框架

系列教程

CPF 入门教程(一)

CPF 门教程 - 数据绑定和命令绑定(二)

CPF 入门教程 - 样式和动画(三)

CPF 入门教程 - 绘图(四) 

CPF 入门教程 - 设计器和模板库的使用(五)

CPF 入门教程 - 控件布局(六) 

CPF 入门教程 - 属性和事件(七)

CPF 入门教程 - 各个控件介绍(八)

CPF 入门教程 - 各平台各系统发布说明(九) 

大部分控件和WPF对应的,用法大部分可以参考WPF

注意线程安全问题,大部分控件的依赖属性是可以支持线程访问的,但是如果是集合类型的,对集合添加移除这些操作会有线程安全问题,必须委托到主线程。控件的方法不支持线程调用,必须委托到主线程。

对于MainModel 也必须注意,最好不要多线程访问MainModel的属性,必须委托到主线程。

控件的Invoke方法或者CPF.Threading.Dispatcher.MainThread.Invoke

Invoke(()=> {
//操作代码
});

Border

在另一个元素四周绘制边框和背景,支持任意圆角和阴影,大部分元素都提供边框设置

CPF 入门教程第1张

CornerRadius属性设置四个角的圆角大小

BorderType定义两种边框模式

        /// 四周边框一样粗,BorderStroke属性定义粗细样式,支持设置虚线

        BorderStroke,

        /// 四周边框可以不同粗细,BorderThickness属性定义四周粗细,如果定义圆角了可能会有锯齿

        BorderThickness,

ShadowHorizontal ,ShadowVertical,ShadowBlur,ShadowColor  提供对阴影的设置

Button

CPF 入门教程第2张

继承自ContentControl

Content属性可以设置字符串,图片或者UIElement等等的内容,一般的如果做图标加文字效果,直接在设计器里加图标加文字的控件组就行

CheckBox

Content属性可以设置字符串,图片或者UIElement等等的内容

IsThreeState定义是否是三种状态。 IsChecked定义选中状态

 CPF 入门教程第3张CPF 入门教程第4张CPF 入门教程第5张

RadioButton

Content属性可以设置字符串,图片或者UIElement等等的内容

通过这个GroupName属性分组,通过Window或者View这类的根元素的GetRadioButtonValue()方法获取选中值,或者用RadioButtonGroup自动绑定

        [RadioButtonGroup("分组1", true)]//绑定RadioButton分组的值,只能在View里使用,默认是用RadioButton的Content作为绑定值
        public string Group1
        {
            get { return GetValue<string>(); }
            set { SetValue(value); }
        }

 CPF 入门教程第6张

ComboBox

Items可以绑定数组或者集合,比如combobox.Items=new String[]{“dfsf”,”gdfs”};

除了直接设置之外也可以直接调用Add方法添加,ComboBox.Items.Add(“dfsfs”);

也可以直接添加ListBoxItem对象

数据项可以是简单的字符串,数值,也可以是自定义类,如果是自定义类,需要定义 DisplayMemberPathSelectedValuePath 属性确定该显示自定义对象的哪个属性。

IsVirtualizing虚拟模式,如果用虚拟模式,Item的高度只能是固定的那种,下拉框高度也是固定的,这种模式可以加载大量数据不会卡

IsEditable 启用编辑模式

SelectionMode 选择模式,可以设置为多选或者单选

ItemTemplate 设置Item的模板,类型继承ListBoxItem

CPF 入门教程第7张

ListBox

数据绑定与操作和ComboBox基本一致,

ItemsPanel 定义内部布局容器,你可以改成水平的或者WrapPanel等等,比如 ItemsPanel=new StackPanel{Orientation=Orientation.Horizontal},虚拟模式下只能用StackPanel

CPF 入门教程第8张

TreeView

Items里加数据外,可以直接加TreeViewItem

DisplayMemberPath定义自定义对象显示的属性

ItemsMemberPath 定义自定义对象子节点的属性名

ItemTemplate 定义模板类型继承TreeViewItem

CPF 入门教程第9张

DataGrid

 暂时不支持自适应列宽度

Columns定义列,列宽支持固定值和权重,权重就是对固定宽度之后的剩余空间的分配,DataGridComboBoxColumnBindingMode定义绑定模式,双向绑定和自动刷新需要数据源支持集合通知INotifyCollectionChanged和里面的数据项要实现INotifyPropertyChanged接口

            new DataGrid
            {
                Width = "60%",
                Height = "60%",
                Columns ={
                    new DataGridComboBoxColumn { Header="dfsd", Binding=new DataGridBinding("p1",BindingMode.TwoWay),Width=100,Items={"0","1","2","3" } },

                    new DataGridCheckBoxColumn { Header="d1fsd", Binding=new DataGridBinding("p2"){ BindingMode= BindingMode.TwoWay },Width=100, },

                    new DataGridTextColumn { Header="3dfsd", Binding=new DataGridBinding("p3"){ BindingMode= BindingMode.TwoWay },Width="*" },

                    new DataGridTextColumn { Header="输入类型验证", Binding=new DataGridBinding("p4"){ BindingMode= BindingMode.TwoWay },Width="100" },

                    new DataGridTextColumn { Header="dfsd", Binding=new DataGridBinding("p5"),Width=100 },

                },
                Bindings = { { nameof(DataGrid.Items), nameof(Model.Data) } }
            };        

CPF 入门教程第10张

如果要往里面加按钮和其他元素,添加 DataGridTemplateColumn 列,自定义单元格模板继承DataGridCellTemplat模板设置到CellTemplate属性,

new DataGridTemplateColumn{Hearder=”da”,Width=100,CellTemplate=typeof(XXXX)}

Picture

用来显示图片的元素,Source属性,可以直接设置URL和文件路径,也可以设置byte[]和Stream的图片数据。res://开头的是读取内嵌资源,区分大小写

StretchStretchDirection 缩放填充模式和WPF里的一样的。

Popup

用来做提示的窗体,ToolTip,右键菜单,下拉框等等就是用这个来做的。

PlacementTarget属性定义弹出的时候位置相对该元素

Placement 属性Popup 控件打开时的控件方向,并指定 Popup 控件在与屏幕边界重叠时的控件行为

Margin 用于调整相对位置的偏移

ContextMenu

Items可以直接绑定数据和ListBox那些一致或者加MenuItem,Separator(分割线)

设置给其他控件的ContextMenu属性

ScrollViewer

表示可包含其他可视元素的可滚动区域。元素加到Content,当元素范围超过ScrollViewer将出现滚动条

HorizontalScrollBarVisibility,VerticalScrollBarVisibility 滚动条可见性控制

VerticalOffset、HorizontalOffset 滚动偏移的获取或者设置

TabControl

Items里加TabItem

new TabControl
{
    Items =
    {
        new TabItem
        {
            Content = new Panel
            {
                Height = "100%",
                Width = "100%",
            },
            Header = "TabItem",
        },
    },
    Height = 104,
    Width = 167,
},

TabIitemHeader属性可以添加UI元素,可以直接在设计器里添加控件组,用来实现图标加文字或者加关闭按钮等等的效果

 CPF 入门教程第11张

SwitchAction属性可以定义切换的动画

                SwitchAction = (oldItem, newItem) =>
                {
                    if (oldItem != null && oldItem.ContentElement != null)
                    {
                        oldItem.ContentElement.TransitionValue(nameof(UIElement.MarginLeft), (FloatField)"-100%", TimeSpan.FromSeconds(0.2), new PowerEase(), AnimateMode.EaseOut, () =>
                       {
                           oldItem.ContentElement.Visibility = Visibility.Collapsed;
                       });
                    }
                    if (newItem != null && newItem.ContentElement != null)
                    {
                        newItem.ContentElement.Visibility = Visibility.Visible;
                        newItem.ContentElement.MarginLeft = "100%";
                        newItem.ContentElement.TransitionValue(nameof(UIElement.MarginLeft), (FloatField)"0%", TimeSpan.FromSeconds(0.2), new PowerEase(), AnimateMode.EaseOut);
                    }
                }

TextBlock  Label

最基本的文本显示元素,Text属性设置显示的字符。一般建议直接使用TextBlock ,TextBlock  属于最基础的文本控件,Label属于复合控件可以修改模板。

TextBlock TextTrimming 可以设置溢出省略号

TextBox

文本输入控件,支持图文复制粘贴显示。

作为单行文本框需要设置这些属性,高度调小一些

    AcceptsReturn: false;

    AcceptsTab :false;

    HScrollBarVisibility:Hidden;

    VScrollBarVisibility :Hidden;

Padding 可以调整文本到边框的边距

Document 属性用来处理稍微复杂的文档元素,比如实现QQ气泡

Window

支持任意透明,对于部分Linux上黑底问题,需要Linux开启桌面合成,默认是不带窗体框架的(标题栏,系统按钮,阴影等),如果需要窗体框架,里面加WindowFrame

ShowDialog()是异步写法,ShowDialogSync 是同步写法

WindowFrame

通用窗体框架,包含窗体边框,系统按钮,阴影这些元素。默认的Window是没有系统按钮那些元素的,加入这个WindowFrame就有了。除了做顶级的窗体外,你可以用这个做定义的内嵌窗体,自定义内嵌窗体需要实现IWindow接口

MaximizeBox是否显示最大化还原按钮

MinimizeBox是否显示最小化

DockPanel

布局容器,里面的子元素设置附加属性 DockPanel.Dock 定义停靠行为

Grid

网格布局容器,里面的子元素设置附加属性 Grid. RowIndex  Grid. ColumnIndex   Grid. RowSpan(跨越的行的数量,默认值1)   Grid. ColumnSpan(跨越列的数量,默认值1)  定义布局行为

ColumnDefinitions,RowDefinitions  列和行,宽度和高度支持权重*或者固定的数值

CPF 入门教程第12张

new Grid
{
    BorderStroke = "1,Solid",
    BorderFill = "#959595",
    PresenterFor = this,
    Name = "testGrid",
    ColumnDefinitions =
    {
        new ColumnDefinition
        {
                                                    
        },
        new ColumnDefinition
        {
                                                    
        },
    },
    Children =
    {
        new GridSplitter
        {
            Height = "100%",
            MarginLeft = 0f,
            Attacheds =
            {
                {
                    Grid.ColumnIndex,
                    1
                },
            },
        },
        new Border
        {
            BorderThickness = "1,2,1,1",
            BorderType = BorderType.BorderThickness,
            MarginLeft = 69,
            Height = 37,
            Width = 47,
        },
    },
    Height = 147,
    Width = 165,
}

MessageBox.Show()

默认弹窗,需要主窗体存在的时候才能使用,样式继承主窗体或者设置的Owner

 CPF 入门教程第13张

SVG

Source属性,可以是svg文件的地址,路径,可以内嵌或者网络的。也可以直接把SVG的文档字符传入,比如<svg>…….</svg>的svg文档

支持显示SVG图形,暂时不支持里面的滤镜,动画,图片引用,文字等,只能显示简单的图形,一般作为矢量图标来使用。对于一些无法显示的svg,可以找svg编辑工具转换一下

图像缩放方式和Picture控件的一样

Switch

开关按钮,OnColor,OffColor 定义开和关的颜色

CPF 入门教程第14张CPF 入门教程第15张

DatePicker,TimePicker

日期和时间控件

CPF 入门教程第16张CPF 入门教程第17张

LayerDialog 

定义一个遮罩弹出层对话框

new LayerDialog { Width = 400, Height = 300, Content = new Button { Content = "测试" } }.ShowDialog(this);

CPF 入门教程第18张

 LoadingBox

定义一个遮罩加载动画。下面的是扩展方法,需要using CPF;

// 定义一个加载动画,你可以将耗时操作放到work委托里,可以异步等待返回一个值。里面可以执行多个分段的任务,并且刷新Message。
 var r = await this.ShowLoading("开始加载...",a =>
 {
        System.Threading.Thread.Sleep(1000);
        a.Message = "加载组件1...";
        System.Threading.Thread.Sleep(1000);
        a.Message = "加载组件2...";
        System.Threading.Thread.Sleep(1000);
        return "结果";
});

CPF 入门教程第19张

Chart

支持折线,曲线,条形的显示,支持缩放滚动

new Chart
{
    GridShowMode = GridShowMode.Horizontal,
    GridFill = "#A5A5A5",
    YAxisScaleCount = 3,
    ChartFill = "#C7E5F6",
    CanScroll = true,
    IsAntiAlias = true,
    Height = 184,
    Width = 245,
    XAxis=
    {
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
    },
    Data =
    {
        new ChartBarData
        {
            Name="test",
            Fill="#faf",
            Format="#'%'",
            Data =
            {
                1,
                2,
                3
            }
        },
        new ChartBarData
        {
            Name="test1",
            Fill="#0af",
            Format="#'%'",
            ShowValueTip=true,
            Data =
            {
                4,
                5,
                2
            }
        },
        new ChartLineData
        {
            Name="test2",
            LineFill="#a0f",
            Format="#'%'",
            LineType= LineTypes.Curve,
            BottomFill="#ff000033",//ShowValueTip=true,
            Data =
            {
                4,
                5,
                2,
                3,
                4,
                3,
                4,
                5,
                2,
                3,
                4,
                3,
            }
        },
        new ChartLineData
        {
            Name="test2测试",
            LineFill="#0a0",
            BottomFill="#00000055",
            Data =
            {
                3,
                4,
                5,
                4,
                3,
                5,
                3,
                4,
                5,
                4,
                3,
                5,
                5,
                3,
                4,
                5,
                4,
                6,
                5
            }
        },
    }
},

CPF 入门教程第20张

PieChart

支持饼图,圆环图

new PieChart
{
    RingWidth = "40%",
    Height = 219,
    Width = 279,
    IsAntiAlias=true,
    Data =
    {
        new PieChartData
        {
            Name="test1",
            Fill="#ff000055",
            Value=3
        },
        new PieChartData
        {
            Name="test2",
            Fill="#00ff0055",
            Value=5
        },
        new PieChartData
        {
            Name="test3",
            Fill="#0000ff55",
            Value=5
        },
        new PieChartData
        {
            Name="test4",
            Fill="#00ffff55",
            Value=5
        },
        new PieChartData
        {
            Name="test5",
            Fill="#a0fa0f55",
            Value=1
        },
    }
},

CPF 入门教程第21张

NotifyIcon

系统托盘图标或者状态栏图标,不是所有系统都支持,部分Linux上不支持显示。

一般定义个全局的NotifyIcon对象就行,不需要添加到窗体上

NumericUpDown

用于设置数值的控件,Maximum,Minimum,Value   最大值,最小值,当前值

CPF 入门教程第22张

Slider

CPF 入门教程第23张

 CPF 入门教程第24张

Expander

可折叠内容显示窗口的标题

new Expander
{
    Header="test",
    Content= new Button
    {
        Content="test内容"
    }
}

CPF 入门教程第25张CPF 入门教程第26张

VideoView

视频播放控件,Nuget 安装Xhm.CPF.Vcl      然后使用VideoView控件,控件初始化之后使用MediaPlayer属性来对播放器进行详细控制。VideoView. LibVLC一些对象构造需要

new VideoView
{
    Name = "player",
    PresenterFor=this,
    MarginBottom=0,
    MarginLeft=0,
    MarginRight=0,
    MarginTop=0,
}


player.Play(new Uri(@"http://*****.mp4"));//播放

player.MediaPlayer.Pause();//暂停

Vlc封装参考 https://github.com/videolan/libvlcsharp

 

Windows

Nuget 安装 VideoLAN.LibVLC.Windows

Mac

Nuget 安装 VideoLAN.LibVLC.Mac

Linux上需要安装

For ubuntu:

apt-get install libvlc-dev

apt-get install vlc

WebBrowser

封装cef的浏览器控件

需要安装Nuget包

<PackageReference Include="Xhm.CPF.Cef" Version="0.9" />

到 https://cef-builds.spotifycdn.com/index.html#windows64:88.1.6%2Bg4fe33a1%2Bchromium-88.0.4324.96 下载对应平台的二进制文件,一般是选择 Sample Application ......client.tar.bz2

注意版本号:88.1.6+g4fe33a1+chromium-88.0.4324.96

需要注意的是如果你需要的是Linux平台的,建议自己调整编译参数重新编译,因为网站上下载的二进制文件巨大,达到一个G了
一般情况下,把压缩包里的比如libcef...同目录里的所有文件和文件夹都复制到你的程序目录就行
如果是Mac的话
将文件ReleaseChromium Embedded Framework.frameworkChromium Embedded Framework复制到你的程序目录并重命名为libcef.dylib
将“ReleaseChromium Embedded Framework.frameworkLibraries”文件夹中的所有文件和文件夹复制你的程序目录
将“ReleaseChromium Embedded Framework.frameworkResources”文件夹中的所有文件和文件夹复制到你的程序目录

如果你需要支持视频播放,那你需要自己修改编译参数,重新编译才行,具体教程可以百度

如果你想自定义特殊功能,比如拦截请求,你需要继承 WebBrowser,并重写 OnCreateWebBrowser
OnCreateWebBrowser里面写client.LoadHandler = new CpfCefLoadHandler();继承并重写对应的Handler并设置过来

mac上运行在任务栏上可能会有多个图标闪烁之后就没了,是正常的,cef的多进程问题,不影响使用

想修改控件元素和效果?继承你要修改的控件,然后重写InitializeComponent 把定义代码写在里面,不知道怎么定义?设计器,右键模板库,基础控件模板,选择后自动添加,自己根据需要修改。模板中使用PresenterFor 属性是为了区分该对象是否是该模板对象内部使用的。单纯的用name来区分的话会出现错误,因为name会有重复,尤其是多种复杂对象嵌套的时候。

免责声明:文章转载自《CPF 入门教程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mysql 索引中的USING BTREE 的意义FusionCharts简单教程(一)---建立第一个FusionCharts图形下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用Proteus模拟操作HDG12864F-1液晶屏

  在Proteus中模拟了89C52操作HDG12864F-1液晶屏,原理图如下:   一、HDG12864F-1官网信息   该液晶屏是Hantronix的产品,官网上搜索出这个型号是系列型号中的一种,各种型号间的区别主要是尺寸不同、有无背光、背光颜色等等。    下面是官网中几个手册的链接: DataSheet 完整版说明书 控制器说明书,该...

使用WCF传输DataTable:DataTable和Xml格式的字符串相互转换(C#)

背景:项目中要用到客户端向服务端传数据,使用WCF,绑定webHttpBinding,做了一个小例子。 业务逻辑简介:客户端在a表中添加了几条数据,从SQL Server数据库直接取出新添加的数据(DataTable格式的数据),传递给服务端,服务端有着和客户端相同的数据库结构,将收到的数据也同样添加到自己的a表中。除了添加数据,还有可能进行修改、删除等,...

爬取js加密和混淆的例子

作业讲解:js逆向 概述 url:https://nyloner.cn/proxy 需求:将这个网页中的代理ip和端口号进行爬取 难点: 动态变化的请求参数 js加密 需要js逆向 分析 爬取的数据是动态加载 并且我们进行了抓包工具的全局搜索,没有查找到结果 意味着:爬取的数据从服务端请求到的是加密的密文数据 页面每10s刷新一次,刷新后...

JMeter学习笔记--使用HTTP信息头管理器--转载

使用HTTP信息头管理,可以帮助测试人员设定JMeter发送的HTTP请求头所包含的信息。HTTP信息头中包含有”User-Agent"、“Pragma"、”Referer"等属性。尽可能放在线程组一级。除非因为某些原因,测试人员希望不同的HTTP请求使用不同的HTTP信息头。 Test Plan的配置元件中有一些和HTTP属性相关的元件:HTTP Cac...

JS-DOM样式操作

js样式操作 行内式样式操作 //行内式属性的获取 let value = 元素对象.style.属性名; //得到的值为String类型,如果要做算术运算需要转型 //仅能得到行内式属性的值,对于嵌入式、外联式的值无法获取 //属性名需要注意如果在css中唯一个单词则是原单词,如果在css中为多个单词则遵守驼峰命名法...

setsockopt()使用方法(參数具体说明)

int setsockopt(SOCKET s,int level,int optname,const char* optval,int optlen); s(套接字): 指向一个打开的套接口描写叙述字level:(级别): 指定选项代码的类型。SOL_SOCKET: 基本套接口IPPROTO_IP: IPv4套接口IPPROTO_IPV6: IPv6套...