CPF C#跨平台桌面UI框架

系列教程

CPF 入门教程(一)

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

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

CPF 入门教程 - 绘图(四)

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

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

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

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

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

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

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

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

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

Border

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

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

BorderType定义两种边框模式

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

BorderStroke,

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

BorderThickness,

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

Button

继承自ContentControl

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

CheckBox

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

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

 

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); }
}

ComboBox

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

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

也可以直接添加ListBoxItem对象

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

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

IsEditable 启用编辑模式

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

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

ListBox

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

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

TreeView

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

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

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

ItemTemplate 定义模板类型继承TreeViewItem

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) } }
};

如果要往里面加按钮和其他元素,添加 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元素,可以直接在设计器里添加控件组,用来实现图标加文字或者加关闭按钮等等的效果

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  列和行,宽度和高度支持权重*或者固定的数值

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

SVG

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

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

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

Switch

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

DatePicker,TimePicker

日期和时间控件

LayerDialog

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

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

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 "结果";
});

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
}
},
}
},

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
},
}
},

NotifyIcon

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

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

NumericUpDown

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

Slider

Expander

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

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

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

CPF 入门教程 - 各个控件介绍(八)的更多相关文章

  1. 2013 duilib入门简明教程 -- 复杂控件介绍 (13)

      首先将本节要介绍的控件全部拖到界面上,并调整好位置,如图:           然后将Name属性改成其他名字,          不能是[控件名+UI+数字]这种,因为这是DuiDesigner ...

  2. 2013 duilib入门简明教程 -- 简单控件介绍 (12)

        前面的教程应该让大家对duilib的整体有所映像了,下面就来介绍下duilib具体控件的使用.     由于官方没有提供默认的控件样式,所以我就尽量使用win7或者XP自带的按钮样式了,虽然界 ...

  3. EasyMvc入门教程-基本控件说明(1)按钮

    按钮是我们最常用的控件之一了,先看下我们提供的按钮风格: 不同颜色的: 实现代码: @Html.Q().Button().Text("Danger").ColorDanger() ...

  4. EasyMvc入门教程-基本控件说明(4)折叠面板

    折叠面板一般出现在管理后台,大家用的OutLook里就是用了折叠面板,样子大概是这样的: 把其中的内容替换成图标按钮,是不是就是我们常见的样子了?:)那么如何实现呢?请看例子: @{ var data ...

  5. EasyMvc入门教程-基本控件说明(6)进度条

    进度条的发明是很牛逼的,就如12306采用了队列解决了系统崩溃的问题一样..:) 进度条大家都见过,那么我们先来实现一个简单的进度条,请看例子: @Html.Q().Progress().Value( ...

  6. EasyMvc入门教程-基本控件说明(8)提醒导航

    提醒导航顾名思义就是提醒大家注意某些文字了..请看下面的例子: 实现代码如下: @Html.Q().BlockRemind().Text("我可以作为提醒使用") 有的同学会说:这 ...

  7. EasyMvc入门教程-基本控件说明(12)栏目导航

    栏目导航一般用来显示当前页面所在的模块层级位置关系,如下图所示: 当然也有前端网站作为小栏目导航,凡是没有绝对,只要不违和就好:),下面上代码: @{ var data = new List<N ...

  8. EasyMvc入门教程-基本控件说明(13)选项卡导航

    选项卡Tab导航主要用于企业页面显示不同子类或者子页面的信息内容. 先来一个基本的使用例子:代码如下: @{ var data = new List<TabItem>() { new Ta ...

  9. EasyMvc入门教程-图形控件说明(21)线形图+柱状图+饼形图

    本章将介绍一些基本但常用的图形:线型图,柱状图和饼形图. 以上三种图形对于的数据都是键值对数组,请参考第一个例子: @{ var data = new List<LineItem>(); ...

随机推荐

  1. sql-4-函数

    常见函数 1.运算函数 select ABS(-8) -- 绝对值 select ceiling(9.4) -- 向上取整 select floor(9.4) -- 向下取整 select rand( ...

  2. 八大排序算法~冒泡排序【加变量flag的作用】

    八大算法~冒泡排序[加变量flag的作用] 1,冒泡排序思想:从第一个数开始找,要把大数"排除在外"~为大数找后座.(从小到大排序哈) 外层循环~需要放后的大数个数: 内循环~从第 ...

  3. 深入刨析tomcat 之---第8篇 how tomcat works 第11章 11.9应用程序,自定义Filter,及注册

    writed by 张艳涛, 标签:全网独一份, 自定义一个Filter 起因:在学习深入刨析tomcat的学习中,第11章,说了调用过滤链的原理,但没有给出实例来,自己经过分析,给出来了一个Filt ...

  4. Samba 远程命令执行漏洞(CVE-2017-7494)

    该漏洞影响Samba 3.5.0之后的所有版本,在4.6.4/4.5.10/4.4.14修复了这个漏洞 use exploit/linux/samba/is_known_pipename set rh ...

  5. 用QT写的简单Todo记事本-附源码(浮动窗口)

    去年边学边写了搞了很久, 已经好久没继续开发了, 先放出来供大家参考吧. 发现自己的学习能力还是不错的. 技术点: 使用QT, QML技术 代码参考: https://github.com/cnscu ...

  6. QT: 如何移动和缩放一个无边框窗口

    一个QT窗口如下可以做到无边框: Window { id: window //Designer 竟然不支持..., 设计模式时要注意 flags: Qt.FramelessWindowHint wid ...

  7. Linux 数据库操作(一)

    我们可以将用于数据服务的数据库分为关系型数据库和非关系型数据库,关系型数据库最典型的就是Mysql,以及和他同源的MariaDB数据库,oracle等,非关系型数据库则有redis数据库,mongod ...

  8. python自动化之(自动化测试报告)

    前言: 给予你们最关心的3步骤 什么是自动化测试报告?  答:在自动化测试过程中自动生成的测试报告 为什么要做自动生成测试报告? 答:真正的解放双手; 可以形成直观的测试结果; 给自己一个装X的机会; ...

  9. 跟我一起写 Makefile(八)

    六.多行变量   还有一种设置变量值的方法是使用define关键字.使用define关键字设置变量的值可以有换行,这有利于定义一系列的命令(前面我们讲过"命令包"的技术就是利用这个 ...

  10. WPF(MVVM) 利用资源字典实现中英文动态切换

    1.首先新建两个字典文件en-us.xaml.zh-cn.xaml.定义中英文的字符串在这里面. 2.将两个资源字典添加到App.xaml中,这里注意下,因为两个字典中有同样字符,如果没有动态更改,默 ...