gpt4 book ai didi

wpf - 如何使用 Powershell 在 XAML 数据网格中的列上设置样式属性?

转载 作者:行者123 更新时间:2023-12-04 20:49:37 25 4
gpt4 key购买 nike

我正在使用 Powershell 和 XAML 构建 WPF UI。我遇到问题的特定功能是在列上设置样式。我可以在 XAML 中设置样式,但是有 9 列(3 个数据网格中的每列 3 列),所以我觉得在代码中设置属性而不是重复同一个 block 9 次会更整洁。

这是我通过 XAML 在单个列上设置样式的方式:

<DataGridTextColumn Header="Attribute" Binding="{Binding Attribute}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="Text" Value="">
<Setter Property="Background" Value="LightGreen"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>

这会将空白单元格设置为浅绿色。但是,我的首选方法是在 Powershell 中进行设置。

到目前为止,我已经弄明白了如何在 Powershell 中手动创建列(如果它们未明确添加到 XAML 中)。我这样做(绑定(bind)到控件之后):

$arrAllDataGrids = @($dataGridUser, $dataGridHome, $dataGridWWID)
ForEach ($objDataGrid in $arrAllDataGrids)
{
$objDataGrid.AutoGenerateColumns = $false
$colAttribute = New-Object System.Windows.Controls.DataGridTextColumn -Property @{"Header" = "Attribute"; "Binding" = New-Object System.Windows.Data.Binding "Attribute"}
$colValue = New-Object System.Windows.Controls.DataGridTextColumn -Property @{"Header" = "Value"; "Binding" = New-Object System.Windows.Data.Binding "Value"}
$colDate = New-Object System.Windows.Controls.DataGridTextColumn -Property @{"Header" = "Date"; "Binding" = New-Object System.Windows.Data.Binding "Date"}
$arrColumns = @($colAttribute, $colValue, $colDate)
ForEach ($objColumn in $arrColumns) {$objDataGrid.Columns.Add($objColumn)}
}

但是,如果我尝试通过 Powershell 添加样式,我会遇到依赖属性。我试图通过在 XAML 中创建样式然后尝试在 Powershell 中对其进行逆向工程来检查它们,这就是我到目前为止所做的:

$dataGridUser.Columns[0].ElementStyle 是类型 System.Windows.Style$dataGridUser.Columns[0].ElementStyle.Triggers 是类型 System.Windows.Trigger$dataGridUser.Columns[0].ElementStyle.Triggers.Property 是类型 Selected.System.Windows.Trigger$dataGridUser.Columns[0].ElementStyle.Triggers.Property.Property 是类型 System.Windows.DependencyProperty

我无法创建一个 System.Windows.DependencyProperty 类型的对象,它应该包含 Text 的 Name 属性。到目前为止,我所管理的最好的方法是通过 XAML 创建一个列,然后像这样提取 Dependency 属性对象:

$objDepend = $($dataGridUser.Columns[0].ElementStyle.Triggers | Select Property).Property

使用这个对象,然后我可以创建一个具有正确触发器属性的新列对象(我明白这仍然缺少“Setter”属性,但我认为相同的原则将适用),如下所示:

$objSelect = $(New-Object System.Windows.Trigger | Select Property)
$objSelect.Property = $objDepend
$objTrigger = New-Object System.Windows.Trigger
$objTrigger.Value = ""
$objTrigger.Property = $objSelect.Property
$objStyle = New-Object System.Windows.Style
$objStyle.Triggers.Add($objTrigger)
$colAttribute = New-Object System.Windows.Controls.DataGridTextColumn -Property @{"Header" = "Attribute"; "Binding" = New-Object System.Windows.Data.Binding "Attribute"; "ElementStyle" = $objStyle}

虽然这显然不是解决此问题的正确方法,但我显然遗漏了一些东西,大概是围绕依赖属性,我怀疑这些属性是派生的而不是简单设置的。

我希望一切都有意义,有人可以帮忙吗?

最佳答案

我希望回答我自己的(也是唯一的)问题是可以接受的,但我想我会分享我开发的解决方案,以防其他人处于类似的位置。

只需编写一个函数来创建 Windows.Style.Object 并将其传回。我从两个默认字符串开始:

$strXAMLStart = @"
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<DataGrid x:Name="dataGridTrigger">
<DataGrid.Columns>
<DataGridTextColumn>
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>`n
"@

$strXAMLEnd = @"
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
"@

因此该函数使用传递给它的样式参数简要地创建并加载了一个 XAML 对象,然后提取样式对象并将其作为函数的结果传回。然后可以将其应用于 UI 中的列。函数如下:

Function Set-ColumnStyle ($hashStyle)
{
Add-Type -AssemblyName PresentationFramework
Add-Type -AssemblyName PresentationCore
Add-Type -AssemblyName WindowsBase
Add-Type -AssemblyName System.Windows.Forms

$strXAMLTrigger = $null
ForEach ($key in $hashStyle.Keys)
{
$strValue = $hashStyle[$key]
If ($key -eq "Blank") {$strTrigger = ""}
Else {$strTrigger = $key}
$strXAMLTrigger += " <Trigger Property=`"Text`" Value=`"$strTrigger`">`n"
$strXAMLTrigger += " <Setter Property=`"Background`" Value=`"$strValue`"/>`n"
$strXAMLTrigger += " </Trigger>`n"
}

[xml]$xamlContent = $strXAMLStart + $strXAMLTrigger + $strXAMLEnd

$xamlReader = (New-Object System.Xml.XmlNodeReader $xamlContent)
$xamlWindow = [Windows.Markup.XamlReader]::Load($xamlReader)
$dataGridTrigger = $xamlWindow.FindName("dataGridTrigger")
$objStyle = $dataGridTrigger.Columns[0].ElementStyle

Return $objStyle
}

我使用字符串“blank”来表示实际的空白单元格,因此如果检测到它,将替换为“”。您现在可以调用此函数并将列内容的哈希表传递给所需的颜色,并使用返回的对象来设置列的样式:

$hashStyle = @{"Blank" = "#FFFF5050"; "0" = "#FF50FF50"; "267009" = "#FF50FF50"}
$objStyle = Set-ColumnStyle $hashStyle
$colDay = New-Object System.Windows.Controls.DataGridTextColumn -Property @{"Header" = "Day"; "Binding" = New-Object System.Windows.Data.Binding "Day"; "ElementStyle" = $objStyle}
$dataGridScripts.Columns.Add($colDay)

希望一切都有意义!

关于wpf - 如何使用 Powershell 在 XAML 数据网格中的列上设置样式属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22062986/

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