Wpf 如何使用Powershell在XAML数据网格中设置列的样式属性?
我正在使用Powershell和XAML构建WPF UI。我遇到的一个问题是设置列的样式。我可以在XAML中设置样式,但是有9列(3个数据网格中各有3列),因此我觉得在代码中设置属性比在同一块中重复9次更整洁 以下是我如何通过XAML在单个列上设置样式:Wpf 如何使用Powershell在XAML数据网格中设置列的样式属性?,wpf,xaml,powershell,Wpf,Xaml,Powershell,我正在使用Powershell和XAML构建WPF UI。我遇到的一个问题是设置列的样式。我可以在XAML中设置样式,但是有9列(3个数据网格中各有3列),因此我觉得在代码中设置属性比在同一块中重复9次更整洁 以下是我如何通过XAML在单个列上设置样式: <DataGridTextColumn Header="Attribute" Binding="{Binding Attribute}"> <DataGridTextColumn.ElementStyle>
<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添加样式,我会遇到依赖属性。我尝试通过在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类型的对象,该对象应包含文本的Name属性。到目前为止,我管理的最好方法是通过XAML创建一列,然后像下面这样提取依赖项属性对象:
$objDepend = $($dataGridUser.Columns[0].ElementStyle.Triggers | Select Property).Property
$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}
使用此对象,我可以创建一个具有正确触发器属性的新列对象(我知道它仍然缺少“Setter”属性,但我认为同样的原则也适用),如下所示:
$objDepend = $($dataGridUser.Columns[0].ElementStyle.Triggers | Select Property).Property
$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>
"@
希望一切都有意义
$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)