source

WPF에서 그리드 행 숨기기

ittop 2023. 5. 27. 11:58
반응형

WPF에서 그리드 행 숨기기

나는 간단한 WPF 양식을 가지고 있습니다.Grid양식에 명시된이것.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물건들에게, 하지만 그것은 효과가 없는 것처럼 보였습니다.

다음과 같이 생각할 수 있습니다.양식이 있고, 그 안에 "결제 유형"이라는 드롭다운이 있고, "현금"을 선택한 경우 카드 세부 정보가 포함된 행을 숨기려고 합니다.이미 숨긴 상태에서 양식을 시작하는 것은 선택사항이 아닙니다.

행에는 가시성 속성이 없으므로 다른 사용자가 말했듯이 높이를 설정해야 합니다.다른 옵션은 여러 보기에서 이 기능이 필요한 경우 컨버터를 사용하는 것입니다.

    [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>

행 또는 열을 접을 수 있는 가장 좋고 깨끗한 솔루션은 데이터 트리거를 사용하는 것입니다. 이 경우 다음과 같습니다.

<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

그리드 내 요소 접기도 작동하지만 그리드에 접기 가능한 요소가 없는 항목이 많은 경우에는 이 방법이 조금 더 간단합니다.이것은 좋은 대안을 제공할 것입니다.

참고로,Visibility3개의 상태로 이루어진 시스템입니다.윈도우.가시성 열거:

  • 표시 - 요소가 렌더링되고 레이아웃에 참여합니다.
  • 축소됨 - 요소가 보이지 않으며 레이아웃에 참여하지 않습니다.0의 높이와 너비를 효과적으로 부여하고 존재하지 않는 것처럼 행동합니다.
  • 숨김 - 요소는 보이지 않지만 레이아웃에 계속 참여합니다.

이 팁과 WPF 팁 및 트릭 스레드의 기타 팁을 참조하십시오.

그리드 행을 만지작거리는 대신 컨트롤(행에 있는 필드)의 가시성 속성을 "닫힘"으로 설정할 수 있습니다.이렇게 하면 컨트롤이 공간을 차지하지 않고 그리드 행 높이="Auto"를 선택하면 행의 모든 컨트롤에 Visibility="Collapseed"가 있기 때문에 행이 숨겨집니다.

<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);

이용하시겠다면visibility.Collapse그러면 당신은 줄의 모든 구성원에게 그것을 설정해야 합니다.

행의내가설로 합니다.Visibility.Collapsed숨김 신에.이렇게 하면 내용이 공간을 차지하지 않고 행이 적절하게 줄어들게 됩니다.

RowDefinition을 상속함으로써 비슷한 아이디어를 얻었습니다(그냥 흥미를 위해서).

public class MyRowDefinition : RowDefinition
{
    private GridLength _height;

    public bool IsHidden
    {
        get { return (bool)GetValue(IsHiddenProperty); }
        set { SetValue(IsHiddenProperty, value); }
    }

    // Using a DependencyProperty as the backing store for IsHidden.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsHiddenProperty =
        DependencyProperty.Register("IsHidden", typeof(bool), typeof(MyRowDefinition), new PropertyMetadata(false, Changed));

    public static void Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var o = d as MyRowDefinition;
        o.Toggle((bool)e.NewValue);
    }

    public void Toggle(bool isHidden)
    {
        if (isHidden)
        {
            _height = this.Height;
            this.Height = new GridLength(0, GridUnitType.Star);
        }                                                     
        else
            this.Height = _height;
    }          
}

이제 다음과 같이 사용할 수 있습니다.

 <Grid.RowDefinitions>
        <RowDefinition Height="2*" />
        <my:MyRowDefinition Height="4*" IsHidden="false" x:Name="RowToHide" />
        <RowDefinition Height="*" />
        <RowDefinition Height="60" />
    </Grid.RowDefinitions>

다음으로 전환합니다.

RowToHide.IsHidden = !RowToHide.IsHidden;

언급URL : https://stackoverflow.com/questions/2502178/hide-grid-row-in-wpf

반응형