gpt4 book ai didi

wpf - WPF 中具有丰富单元格内容的多列列表

转载 作者:行者123 更新时间:2023-12-04 14:02:16 25 4
gpt4 key购买 nike

我正在尝试使用 WPF 和 F# 编写自动化测试工具。我想将聚合测试结果显示为多列列表中的行。理想情况下,我想在每个单元格中呈现丰富的内容,例如使用颜色突出显示特定测试的问题或通过工具提示提供详细信息。但是,我不知道如何将比普通字符串更丰富的内容放入多列 ListView

此外,我不喜欢 XAML 或数据绑定(bind),更喜欢编写原始 F# 代码。我能够编写的显示多列 WPF ListView 的最简单程序是:

open System.Windows

let gridView = Controls.GridView()
let listView = Controls.ListView(View=gridView)

type SystemParams = { Name: string; Value: obj }

[<System.STAThread>]
do
let column header binding =
let binding = Data.Binding binding
Controls.GridViewColumn(Header=header, DisplayMemberBinding=binding)

for header, binding in ["Name", "Name"; "Value", "Value"] do
column header binding
|> gridView.Columns.Add

for prop in typeof<SystemParameters>.GetProperties() do
if prop.PropertyType <> typeof<ResourceKey> then
{ Name = prop.Name; Value = prop.GetValue(null, null) }
|> listView.Items.Add
|> ignore

Application().Run(Window(Content=listView)) |> ignore

虽然这可行,但我不喜欢它要求字段名称在类型定义中和作为字符串被复制到 WPF 的方式,WPF 可能会在运行时使用反射来解析它们(yuk! ).理想情况下,我想添加一个obj数组,为每个单元格提供WPF控件。

ListView 有这个能力吗?如果是这样,您如何编写接受二维控件数组并返回可视化它们的 ListView 的函数?

如果没有,我可能会改用 Grid。我以前尝试过 DataGrid,相比之下,它只是一个痛苦的世界......

编辑:

感谢下面的回答,我已经能够想出一个解决方案。下面程序中的 multiColumnList 函数创建具有给定标题和内容的控件列表以及可选择的行:

open System.Windows

let multiColumnList columns contents onSelection =
let gridView = Controls.GridView()
let list = Controls.ListView(View=gridView)
let column index header =
let binding = Data.Binding(sprintf "[%d]" index)
Controls.GridViewColumn(Header=header, DisplayMemberBinding=binding)
|> gridView.Columns.Add
Seq.iteri column columns
list.ItemsSource <-
[|for row in contents ->
[|for elt in row ->
box elt|]|]
list.SelectionChanged.Add onSelection
list

[<System.STAThread>]
do
let columns = ["Name"; "Value"]
let contents =
[ for prop in typeof<SystemParameters>.GetProperties() do
if prop.PropertyType <> typeof<ResourceKey> then
yield [box prop.Name; prop.GetValue(null, null)] ]
Application().Run(Window(Content=multiColumnList columns contents ignore))
|> ignore

最佳答案

是的,这是可能的,但是有点棘手,但是一旦您掌握了这种方法,它就会非常灵活。 WFP 有一个灵活的模板系统,可以通过代码和 XAML 使用,除了很少有关于如何在代码中执行此操作的示例。

它主要涉及如何使用 FrameworkElementFactory 覆盖列表框默认模板并显示您想要的 UI 元素。然后使用 Binding 类指定控件应如何绑定(bind)到数据。

我用 WPF 和 F# 编写了一个 Twitter 客户端,我使用这种方法在列表框中显示推文的列。看看 createTweetContainerTemplate 函数是如何工作的。 https://github.com/robertpi/TwitMemento/blob/master/Strangelights.TwitMemento.WPF/View.fs

然后再说一遍,除非您真的需要高度控制列表框中每一行的布局方式,否则使用数据网格可能更简单。

关于wpf - WPF 中具有丰富单元格内容的多列列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9325957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com