2017-06-19 112 views
0

我Woking的基於PowerShell來獲取來自多個服務器的磁盤信息,我需要背景色設置爲特定的細胞形式Percentfree列,RED當磁盤WPF工具細胞Datagrid的背景顏色如果可用空間在10-15%之間,則可用空間小於10%,橙色可用空間小於10%。通過對夫婦去爲博客/文章後,不知何故,我設法除了還在苦苦設置多個值或值範圍背景顏色的預期結果。PowerShell的WPF - 基於價值

任何幫助,在此,將不勝感激。謝謝..!

<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() 
{ 
[email protected]() 
$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

呃......那麼,是的,你嘗試過什麼到目前爲止PowerShell的一部分嗎? – grek40

+0

嗨,感謝您的答覆...會有點莫名其妙工作我設法讓細胞背景顏色使用單值數據網格視圖但仍然奮力預期的結果,以多個值的同一列。 – samtiger

回答

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> 

注意我不是100%地肯定在DataContext上<DataTrigger Binding="{Binding CPercentfree,Converter={StaticResource cWarningLevel}}"一部分。您可能必須將其更改爲<DataTrigger Binding="{Binding Converter={StaticResource cWarningLevel}}"最終。