我正在使用基于Powershell的WPF工具来获取来自多个服务器的磁盘信息,我需要将背景颜色设置为特定单元格,如果磁盘的可用空间少于10%,则Percentfree列为RED,如果为10-15%的可用空间。经过一对夫妇的博客/文章,不知何故,我设法获得预期的结果,除了仍然努力为多个值或值范围设置背景颜色。
任何帮助都将不胜感激。谢谢..!
<DataGrid Name="diskstatus" HorizontalAlignment="Left" Margin="24,65,0,10" Width="739" GridLinesVisibility="None" AlternatingRowBackground="Lightgray" AlternationCount="2">
<DataGrid.Columns>
<DataGridTextColumn Header="Server Name" Binding="{Binding ServerName}" Width="130"/>
<DataGridTextColumn Header="Csize (GB)" Binding="{Binding Csize}" Width="100"/>
<DataGridTextColumn Header="Cfree (GB)" Binding="{Binding Cfree}" Width="100"/>
<DataGridTextColumn Header="CPercentfree" Binding="{Binding CPercentfree}" Width="100">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="Text" Value="5">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Dsize (GB)" Binding="{Binding Dsize}" Width="100"/>
<DataGridTextColumn Header="Dfree (GB)" Binding="{Binding Dfree}" Width="100"/>
<DataGridTextColumn Header="DPercentfree" Binding="{Binding DPercentfree}" Width="100"/>
</DataGrid.Columns>
</DataGrid>
Powershell函数获取磁盘信息:
Function Getdiskinfo()
{
$dsk=@()
$importcsv= Import-Csv -Path $TPAcsvfile
$Getservers = $importcsv.servername
foreach ($CompName in $Getservers)
{
$cdrivespace= Get-WMIObject Win32_logicaldisk -ComputerName $CompName | ?{$_.DeviceID -eq 'C:'} | Select @{Name=‘cTotalSize’;Expression={[int]($_.Size / 1gb)}},`
@{Name=‘cFreeSpace’;Expression={[int]($_.FreeSpace / 1gb)}}, @{Name=‘cPercentFree’;Expression={[math]::Round($_.FreeSpace / $_.Size,2)*100}}
$ddrivespace= Get-WMIObject Win32_logicaldisk -ComputerName $CompName | ?{$_.DeviceID -eq 'D:'} | Select @{Name=‘dTotalSize’;Expression={[int]($_.Size / 1gb)}},`
@{Name=‘dFreeSpace’;Expression={[int]($_.FreeSpace / 1gb)}}, @{Name=‘dPercentFree’;Expression={[math]::Round($_.FreeSpace / $_.Size,2)*100}}
$diskinfo = New-Object psobject
Add-Member -InputObject $diskinfo -membertype noteproperty -name "ServerName" -value $CompName
Add-Member -InputObject $diskinfo -membertype noteproperty -name "cSize" -value $cdrivespace.cTotalSize
Add-Member -InputObject $diskinfo -membertype noteproperty -name "cFree" -value $cdrivespace.cFreeSpace
Add-Member -InputObject $diskinfo -membertype noteproperty -name "cPercentfree" -value $cdrivespace.cPercentFree
Add-Member -InputObject $diskinfo -membertype noteproperty -name "DSize" -value $ddrivespace.dTotalSize
Add-Member -InputObject $diskinfo -membertype noteproperty -name "DFree" -value $ddrivespace.dFreeSpace
Add-Member -InputObject $diskinfo -membertype noteproperty -name "DPercentfree" -value $ddrivespace.dPercentFree
$diskstatus.addchild($diskinfo)
$dsk +=$diskinfo
} Return, $dsk
}
答案 0 :(得分:0)
我不知道Powershell-WPF
的限制,但基本上,您应该创建一个从CPercentfree
转换为聚合范围标识符的转换器。
例如,让我们使用具有以下翻译的转换器:
CPercentfree > 15:
Result = 0
CPercentfree >= 10:
Result = 1
Otherwise (lower than 10)
Result = 2
在C#中转换器看起来类似于以下内容,我希望你能为自己翻译它:
public class WarningLevelConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int v = value as Nullable<int> ?? System.Convert.ToInt32(value);
if (v > 15)
{
return 0;
}
if (v >= 10)
{
return 1;
}
return 2;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后在资源的某处创建转换器(假设local
是项目命名空间的xmlns
)
<local:WarningLevelConverter x:Key="cWarningLevel"/>
并将其与一些数据触发器一起使用:
<DataGridTextColumn Header="CPercentfree" Binding="{Binding CPercentfree}" Width="100">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding CPercentfree,Converter={StaticResource cWarningLevel}}" Value="1">
<Setter Property="Background" Value="Orange"/>
</DataTrigger>
<DataTrigger Binding="{Binding CPercentfree,Converter={StaticResource cWarningLevel}}" Value="2">
<Setter Property="Background" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
注意我对<DataTrigger Binding="{Binding CPercentfree,Converter={StaticResource cWarningLevel}}"
部分的DataContext不是100%肯定。您最终可能需要将其更改为<DataTrigger Binding="{Binding Converter={StaticResource cWarningLevel}}"
。