양식에 Grid
선언 된 간단한 WPF 양식이 있습니다. 여기 Grid
에는 여러 행이 있습니다.
<Grid.RowDefinitions>
<RowDefinition Height="Auto" MinHeight="30" />
<RowDefinition Height="Auto" Name="rowToHide" />
<RowDefinition Height="Auto" MinHeight="30" />
</Grid.RowDefinitions>
명명 된 행 rowToHide
에는 몇 개의 입력 필드가 포함되어 있으며 이러한 필드가 필요하지 않다는 것을 감지 한 후이 행을 숨기고 싶습니다. Visibility = Hidden
행의 모든 항목을 설정 하는 것만으로도 간단 하지만 행은 여전히 Grid
. Height = 0
항목 설정 을 시도했지만 작동하지 않는 것 같습니다.
다음과 같이 생각할 수 있습니다. 양식이 있고 여기에 “Payment Type”이라고 표시된 드롭 다운이 있으며, 그 사람이 “Cash”를 선택하면 카드 세부 정보가 포함 된 행을 숨기고 싶습니다. 이미 숨겨진 상태로 양식을 시작하는 것은 옵션이 아닙니다.
답변
행에는 Visibility 속성이 없으므로 다른 사람들이 말했듯이 Height를 설정해야합니다. 다른 옵션은 많은 뷰에서이 기능이 필요한 경우 변환기를 사용하는 것입니다.
[ValueConversion(typeof(bool), typeof(GridLength))]
public class BoolToGridRowHeightConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((bool)value == true) ? new GridLength(1, GridUnitType.Star) : new GridLength(0);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{ // Don't need any convert back
return null;
}
}
그런 다음 적절한보기에서 <Grid.RowDefinition>
:
<RowDefinition Height="{Binding IsHiddenRow, Converter={StaticResource BoolToGridRowHeightConverter}}"></RowDefinition>
답변
행이나 열을 축소하는 가장 좋고 깨끗한 솔루션은 DataTrigger를 사용하는 것입니다.
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" MinHeight="30" />
<RowDefinition Name="rowToHide">
<RowDefinition.Style>
<Style TargetType="{x:Type RowDefinition}">
<Setter Property="Height" Value="Auto" />
<Style.Triggers>
<DataTrigger Binding="{Binding SomeBoolProperty}" Value="True">
<Setter Property="Height" Value="0" />
</DataTrigger>
</Style.Triggers>
</Style>
</RowDefinition.Style>
</RowDefinition>
<RowDefinition Height="Auto" MinHeight="30" />
</Grid.RowDefinitions>
</Grid>
답변
그리드의 행을 참조한 다음 행 자체의 높이를 변경하여이를 수행 할 수도 있습니다.
XAML
<Grid Grid.Column="2" Grid.Row="1" x:Name="Links">
<Grid.RowDefinitions>
<RowDefinition Height="60" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="80" />
</Grid.RowDefinitions>
</Grid>
VB.NET
If LinksList.Items.Count > 0 Then
Links.RowDefinitions(2).Height = New GridLength(1, GridUnitType.Star)
Else
Links.RowDefinitions(2).Height = New GridLength(0)
End If
Grid 내의 요소 축소도 작동하지만 축소 할 수있는 둘러싸는 요소가없는 Grid에 많은 항목이있는 경우 이것은 조금 더 간단합니다. 이것은 좋은 대안을 제공 할 것입니다.
답변
참고로 다음 Visibility
은 세 가지 상태의 System.Windows.Visibility 열거 형입니다.
- Visible-요소가 렌더링되고 레이아웃에 참여합니다.
- 축소됨-요소가 보이지 않으며 레이아웃에 참여하지 않습니다. 효과적으로 높이와 너비를 0으로 지정하고 존재하지 않는 것처럼 작동합니다.
- 숨김-요소가 보이지 않지만 레이아웃에 계속 참여합니다.
이 팁 과 WPF 팁 및 트릭 스레드 에 대한 기타 팁을 참조하십시오 .
답변
Grid Row를 조작하는 대신 컨트롤 (행의 필드)의 Visibility 속성을 “Collapsed”로 설정할 수 있습니다. 이렇게하면 컨트롤이 공간을 차지하지 않고 Grid Row Height = “Auto”인 경우 행의 모든 컨트롤에 Visibility = “Collapsed”가 있으므로 행이 숨겨집니다.
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" Name="rowToHide" />
</Grid.RowDefinitions>
<Button Grid.Row=0 Content="Click Me" Height="20">
<TextBlock Grid.Row=1
Visibility="{Binding Converter={StaticResource customVisibilityConverter}}" Name="controlToHide"/>
</Grid>
이 방법은 변환기의 도움으로 컨트롤의 가시성을 일부 속성에 바인딩 할 수 있기 때문에 더 좋습니다.
답변
다음과 같이하십시오.rowToHide.Height = new GridLength(0);
u를 사용할 경우 visibility.Collapse
행의 모든 구성원에 대해 설정해야합니다.
답변
행의 컨텐츠 가시성을 Visibility.Collapsed
숨김 대신으로 설정하십시오 . 이렇게하면 콘텐츠가 공간을 차지하지 않고 행이 적절하게 축소됩니다.