Powershell WPF XAML Collapse RowDefinition Height or set to Zero with event

649 Views Asked by At

The end effect I'm looking for is to "disappear" row "1", aka: the second row from the top so that Text1 expands down into the area as if row 1 did not exist.

This is a mockup of what I am trying to accomplish. It is nearly exactly the same for the top 2 rows and columns.

If I plug this XAML into VS2017 Community and set the row height to 0 this works. After googling for a couple days I have not come up with a solution.

I do not know C# at all.

Platform: Windows 7 // Posh v5

Soon to be Windows 10 // Posh v5

Ideally, I'd like to start with it closed and open it on event.

[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
[xml]$XAML = @'
<Window 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TabularGrid" Height="300" Width="300">
    <Grid Name="Grid">
                <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="80" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                        <RowDefinition Height="*" />
                        <RowDefinition Height="40" />
                        <RowDefinition Height="30" />
                        <RowDefinition Height="30" />
                </Grid.RowDefinitions>
                <TextBox Name="Text1" Background="Silver" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" >Text1</TextBox>
                <TextBox Name="Text2" Grid.Row="1" Grid.Column="0" >Text2</TextBox>
                <Button Name="Enter" Grid.Row="1" Grid.Column="1" >Enter</Button>
                <Button Name="Open" Grid.Row="2" Grid.ColumnSpan="2" >Open</Button>
                <Button Name="Close" Grid.Row="3" Grid.ColumnSpan="2" >Close</Button>
        </Grid>
</Window>
'@

$reader=(New-Object System.Xml.XmlNodeReader $xaml) 
$Form=[Windows.Markup.XamlReader]::Load( $reader )
$xaml.SelectNodes("//*[@Name]") | %{Set-Variable -Name "WPF$($_.Name)" -Value $Form.FindName($_.Name)}

#===========================================================================
# Store Form Objects In PowerShell
#===========================================================================

Function Get-FormVariables{
if ($global:ReadmeDisplay -ne $true){Write-host "If you need to reference this display again, run Get-FormVariables" -ForegroundColor Yellow;$global:ReadmeDisplay=$true}
write-host "Found the following interactable elements from our form" -ForegroundColor Cyan
get-variable WPF*
}

Get-FormVariables


#===========================================================================
# Shows the form
#===========================================================================


$WPFOpen.Add_Click({
$WPFGrid.RowDefinition[1].Visibility = $true
# or 
$WPFGrid.RowDefinition[1].Height="40"
})

$WPFClose.Add_Click({
$WPFGrid.RowDefinition[1].Visibility = $false
# or 
$WPFGrid.RowDefinition[1].Height="0"
})
#>

$Form.ShowDialog() | out-null

Thank you for looking.

1

There are 1 best solutions below

1
On BEST ANSWER

That's because it's not $WPFGrid.RowDefinition but $WPFGrid.RowDefinitions with a s at the end.

I removed Visibility method because it's not implemented with RowDefinitions and changed <RowDefinition Height="40" /> by <RowDefinition Height="0" /> to start window with the row invisible.

This code is working

[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
[xml]$XAML = @'
<Window 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TabularGrid" Height="300" Width="300">
    <Grid Name="Grid">
                <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="80" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                        <RowDefinition Height="*" />
                        <RowDefinition Height="0" />
                        <RowDefinition Height="30" />
                        <RowDefinition Height="30" />
                </Grid.RowDefinitions>
                <TextBox Name="Text1" Background="Silver" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" >Text1</TextBox>
                <TextBox Name="Text2" Grid.Row="1" Grid.Column="0" >Text2</TextBox>
                <Button Name="Enter" Grid.Row="1" Grid.Column="1" >Enter</Button>
                <Button Name="Open" Grid.Row="2" Grid.ColumnSpan="2" >Open</Button>
                <Button Name="Close" Grid.Row="3" Grid.ColumnSpan="2" >Close</Button>
        </Grid>
</Window>
'@

$reader=(New-Object System.Xml.XmlNodeReader $xaml) 
$Form=[Windows.Markup.XamlReader]::Load( $reader )
$xaml.SelectNodes("//*[@Name]") | %{Set-Variable -Name "WPF$($_.Name)" -Value $Form.FindName($_.Name)}

#===========================================================================
# Store Form Objects In PowerShell
#===========================================================================

Function Get-FormVariables{
if ($global:ReadmeDisplay -ne $true){Write-host "If you need to reference this display again, run Get-FormVariables" -ForegroundColor Yellow;$global:ReadmeDisplay=$true}
write-host "Found the following interactable elements from our form" -ForegroundColor Cyan
get-variable WPF*
}

Get-FormVariables


#===========================================================================
# Shows the form
#===========================================================================


$WPFOpen.Add_Click({
    $WPFGrid.RowDefinitions[1].Height= 40
})

$WPFClose.Add_Click({
    $WPFGrid.RowDefinitions[1].Height= 0
})

$Form.ShowDialog() | out-null