个人中心

联系我们

搜索
搜索 登录 免费注册
界面美化
业务优化
开发工具
图像管理
文档管理
Parasoft

新闻资讯

关注工具软件产品最新动态,了解软件开发行业新趋势。

DevExpress WinForms HTML 和 CSS 支持: 最佳实践

原创
软件开发
来源:DevExpress
DevExpress
Winform
HTML5
ui界面
2024-05-29
DevExpress
Winform
HTML5
ui界面

在这篇文章中,我将概述使用 DevExpress WinForms HTML/CSS 引擎/模板时重要的 "应做 "和 "不应做 "事项。如果您是 DevExpress 的新用户/考虑在即将到来的项目中使用我们的 WinForms UI 库,并且尚未探索 WinForms HTML/CSS 功能的潜力,请先花点时间查看以下在线内容:


使用 HTML/CSS 时的注意事项 

以下 WinForms 使用场景需要基本的 HTML/CSS 知识。


自定义 HTML-CSS 感知控件的用户界面元素(简单)

使用 HTML/CSS 模板为 DevExpress 的 HTML/CSS-aware 控件创建自定义用户界面元素(无需在 CustomDraw~ 事件处理程序中手动绘制)。利用我们的 WinForms HTML/CSS 引擎,您可以自定义 ListBox 和 Combobox 项目、TileView/ItemsView/WinExplorerView 中的卡片、日程安排预约、消息框、工具提示等。您可以从数据感知控件的数据字段中获取值,根据条件实现绑定,并使用 DevExpress 皮肤颜色。


例如,我们的 WinForms Accordion 控件包含多个用于各种用户界面元素(如项目、页脚、组、页眉面板、菜单、按钮、分隔符等)的 HTML 模板:


运行演示: 汉堡菜单(手风琴控件)* * DevExpress WinForms 演示应用程序需要安装我们的 WinForms UI 库。

* DevExpress WinForms 演示应用程序需要安装我们的 WinForms UI 库。


我们集成了 Visual Studio 的 HTML/CSS 模板编辑器允许您在设计界面上管理外观定制。HTML/CSS模板编辑器使用嵌入式语法编辑器,具有智能提示、自动完成、标签导航和预览功能(简化/方便在任何DevExpress驱动的WinForms项目中使用HTML模板)。


我们的 HTML/CSS 模板编辑器包含一组预先设计/可重复使用的模板。您可以 "按原样 "使用这些模板,也可以根据需要进行扩展。您还可以创建自定义 HTML 和 CSS 模板,将模板保存到图库中,并在需要时在任何 WinForms 项目中使用。


在即将发布的版本(v24.1)中,我们将在 HTML Template Designer for Visual Studio 中提供 40 个预先编写好的 HTML 和 CSS 代码片段。这些经过优化的代码片段可解决常见的 HTML 相关任务。


使用 CustomDraw~ 事件自定义控件 UI 元素(简单)

并非所有可通过 CustomDraw~ 事件自定义绘制的 DevExpress WinForms 控制 UI 元素都支持 HTML/CSS 模板。不过,所有 CustomDraw~ 事件的事件参数都包含一个 DrawHtml() 方法。该方法可在 UI 元素顶部绘制 HTML/CSS 模板。


下面的示例在 "页面 B "顶部绘制了一个徽章:


using DevExpress.XtraTab;
void xtraTabControl_CustomDrawTabHeader(object sender, TabHeaderCustomDrawEventArgs e) {
    if (e.TabHeaderInfo.Page == tabPageB) {
        e.DefaultDraw();
        e.Handled = true;
        e.DrawHtml(htmlTemplateBadge);
    }
}


自定义 Draw~/DrawHTML() 实现细节(视频)

点击以上图片免费观看视频 ⬆


该功能的常见使用场景包括


  • 自定义 WinForms 数据网格控件中的预览行(运行演示)。

  • 自定义 TreeList 节点预览部分(运行演示)。

  • 在空控件中显示自定义内容(运行演示)。

  • 在布局控件中自定义卡片标题。


在网格视图中自定义布局和实施数据编辑(简单)

我们设计了网格的 TileView、ItemsView 和 ExplorerView,以便以有组织、视觉效果优美的方式显示数据。但是,在这些视图中编辑数据传统上需要使用额外的 UI 元素(这些网格视图不支持开箱即用的数据编辑)。


为了解决这一限制,您可以在 HTML/CSS 项目模板中嵌入 DevExpress 数据编辑器。下面的动画演示了使用嵌入式 RatingControl 的 WinForms Grid TileView:


自定义单机版数据编辑器(简单)

使用 HTML 和 CSS 模板自定义独立的 WinForms 数据编辑器。只需在我们的 HtmlContentControl 上放置适当的数据编辑器,隐藏编辑器的边框,然后根据需要自定义 HtmlContentControl 的 HTML 模板即可。


<div class="input-box">
<input class="input" name="emailEdit" value="${Email}"/>
</div>
<div class="input-box">
<input class="input" name="passEdit" value="${Password}"/>
</div>
<div class="check-container">
<input class="check-box" name="checkEdit" value="${RememberMe}"/>
Remember me
</div>


运行演示: 登录表单

* DevExpress WinForms 演示应用程序需要安装我们的 WinForms UI 库。


显示简单的交互式元素(简单)

除了静态内容,您还可以在 HTML/CSS 模板中包含交互式元素。HTML 感知控件会暴露与鼠标相关的事件(如 ElementMouseClick、ElementMouseOver、ElementMouseDown 等),您可以处理这些事件来响应 HTML UI 元素上的鼠标操作。


htmlContentControl.ElementMouseClick += (s, e) => {
if(e.ElementId == "btnPhone")
XtraMessageBox.Show("Phone!");
    if(e.ElementId == "btnVideo")
        XtraMessageBox.Show("Video!");
    if(e.ElementId == "btnText")
        XtraMessageBox.Show("Text Message!");
};


<!--HTML Template-->
<div class='buttonPanel'>
    <img id="btnPhone" src="PhoneCall" class="button" />
    <img id="btnVideo" src="VideoCall" class="button" />
    <img id="btnText" src="Message" class="button" />
</div>


运行演示: 交互* * DevExpress WinForms 演示应用程序需要安装我们的 WinForms UI 库。

* DevExpress WinForms 演示应用程序需要安装我们的 WinForms UI 库。


高级应用场景

以下使用场景需要 DevExpress WinForms UI 控件和 HTML/CSS 的高级知识。


创建复杂的数据输入表单(高级)

HTML/CSS 模板允许您创建完全自定义的数据表单。只有当我们的 WinForms LayoutControl 无法让您实现所需的结果时,我们才建议您使用 HTML/CSS 模板。使用 HTML/CSS 从头开始创建布局可能会很耗时,尤其是对于包含多个字段的复杂表单。毋庸置疑,我们的 LayoutControl 在构建时考虑到了可访问性。这包括适当的标签、键盘导航支持以及与屏幕阅读器兼容等功能。


运行演示* * DevExpress WinForms 演示应用程序需要安装我们的 WinForms UI 库。

* DevExpress WinForms 演示应用程序需要安装我们的 WinForms UI 库。


使用自定义绘制显示交互式元素(高级)

并非所有 DevExpress WinForms UI 控件都支持鼠标事件(出于性能原因)。这一限制并不妨碍在 DevExpress 控件中显示交互式用户界面元素。不过,这需要编写更复杂的代码:

DxHtmlPainterContext ctx = new DxHtmlPainterContext();
HtmlTemplate htmlTemplate = new HtmlTemplate(
Loader.Load("ListBoxEmptyForeground.html"),
    Loader.Load("ListBoxEmptyForeground.css"));
listControl.CustomDrawEmptyForeground += (s, e) => {
    e.DrawHtml(htmlTemplate, ctx);
};
// Handles UI feedback (hover/cursor).
listControl.MouseMove += (s, e) => {
    if(listControl.ItemCount == 0) {
        ctx.OnMouseMove(e);
        listControl.Cursor = ctx.GetCursor(e.Location);
        listControl.Invalidate();
    }
    else listControl.Cursor = Cursors.Default;
};
// Handles Click within the btnAdd element.
var items = Enumerable.Range(1, 10)
    .Select(n => string.Format("Item #{0:d2}", n))
    .ToArray();
listControl.MouseDown += (s, e) => {
    if(listControl.ItemCount == 0 && e.Button == MouseButtons.Left) {
        var clickInfo = ctx.CalcHitInfo(e.Location);
        if(clickInfo != null && clickInfo.HasId("btnAdd"))
            listControl.Items.AddRange(items);
    }
};



使用 CustomDraw 显示 UI 元素并将相关状态绑定到数据(高级)

与静态模板不同,数据感知模板渲染需要编写更多代码(尤其是需要从不同来源获取数据时)。下面的示例在网格单元格中绘制了销售徽章。折扣大小从不同的数据源获取。


using DevExpress.XtraEditors;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Views.Base;
using System.Collections.Generic;
namespace DXApplication {
    public partial class Form1 : XtraForm {
        Dictionary<string, double> discounts = new Dictionary<string, double>() {
            { "A", 0.3 },
            { "B", 0.45 },
            { "C", 0.2 }
        };
        public Form1() {
            InitializeComponent();
            gridControl1.DataSource = new List<Product>() {
                new Product(){ Category = "A", Name = "AA", Price = 159.99},
                new Product(){ Category = "A", Name = "AB", Price = 159.99},
                new Product(){ Category = "B", Name = "BA", Price = 49.99},
                new Product(){ Category = "B", Name = "BB", Price = 89.99},
                new Product(){ Category = "C", Name = "CA", Price = 799.99},
            };
            gridView1.CustomDrawCell += GridView1_CustomDrawCell;
        }
        void GridView1_CustomDrawCell(object sender, RowCellCustomDrawEventArgs e) {
            e.DefaultDraw();
            e.Handled = true;
            GridView view = sender as GridView;
            string category = view.GetRowCellValue(e.RowHandle, view.Columns["Category"]) as string;
            if (e.Column.FieldName == "Price" && discounts.ContainsKey(category)){
                e.DrawHtml(htmlTemplateSaleBadge, args => {
                    args.SetFieldValue("Discount", discounts[category].ToString("p0"));
                });
            }
        }
    }
    public class Product {
        public string Name { get; set; }
        public string Category { get; set; }
        public double Price { get; set; }
    }
}


使用 HTML/CSS 创建完全自定义的用户界面控件(高级)

我们的 WinForms HtmlContentControl 是使用 HTML-CSS 标记构建 WinForms UI 的 "表面"。WinForms HtmlContentPopup 是其弹出版本。这些组件可从 HTML/CSS 代码生成 WinForms 界面,并允许您设计定制的 WinForms UI 控件。使用 DevExpress 组件和 HTML/CSS 创建自定义用户界面控件是一种高级技术,需要深入了解用户界面开发的两种技术/要素。


运行演示* * DevExpress WinForms 演示应用程序需要安装我们的 WinForms UI 库。

* DevExpress WinForms 演示应用程序需要安装我们的 WinForms UI 库。


可视化集合(高级)

数据源可能包括存储项目集合的数据字段:列表、数组、数据集等。<dx-collection> 标签是一个独特的 DevExpress 元素。通过它,您可以为需要可视化的项目指定集合属性(以及必须应用于这些项目的模板)。使用 <dx-collection> 等自定义标记会对 HTML 模板提出特定要求,以实现正确的功能。


运行演示: 磁贴视图(HTML/CSS 模板)* * DevExpress WinForms 演示应用程序需要安装我们的 WinForms UI 库。

* DevExpress WinForms 演示应用程序需要安装我们的 WinForms UI 库。


使用我们的 WinForms HTML 和 CSS 引擎时的注意事项

  • 不要创建复杂的嵌套柔性布局。(例如,3 个或更多嵌套的柔性面板)

  • 不要创建 CSS 动画。

  • 处理用户界面控件事件时不要修改 HTML 元素。

  • 不要在 HTML 模板中基于 HTML 元素实现逻辑。最好在模型中创建一个单独的属性,并在模型中计算逻辑。

  • 不要原封不动地使用外部资源中预先编写的 HTML/CSS 代码。这些代码可能无法正常工作,因为我们并不支持所有 HTML 标记/属性。


联系我们

周一至周日 8:00-23:00

免费热线

023-62585653

张经理:13082556879

罗经理:17558866126

许经理:13057566525

开发外包

ERP-一体化

小程序

企业微信客服

版权所有:重庆庚乾信息科技有限公司 ©2025 Gengqian Information Technology Co., Ltd. 渝ICP备2022008063号-2 渝公网安备50010702505508

版权所有:重庆庚乾信息科技有限公司

©2025 Gengqian Information Technology Co., Ltd. 渝ICP备2022008063号-2 渝公网安备50010702505508