[wpf] WPF에서 그리드 행 숨기기

양식에 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숨김 대신으로 설정하십시오 . 이렇게하면 콘텐츠가 공간을 차지하지 않고 행이 적절하게 축소됩니다.