none
ListView의 Height가 NaN을 갖습니다. RRS feed

  • 질문

  • 화면의 크기에 따라 ListView의 크기가 달라져야 하기 때문에 다음 소스코드와 같이 구성하였습니다.

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> <Grid.ColumnDefinitions> <ColumnDefinition Width="150"/> <ColumnDefinition Width="1*"/> <ColumnDefinition Width="3*"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="150"/> <RowDefinition Height="*"/> <RowDefinition Height="150"/> </Grid.RowDefinitions> <Grid Grid.Column="1" Grid.Row="1">

    <StackPanel> <TextBlock Text="Postgre 읽기 테스트" FontSize="25" Height="30"/> <Button x:Name="btn_DB" FontSize="20" Content="Tblkorea Read 테스트 버튼" Click="btn_DB_Click"/> <ListView x:Name="lv_DB" FontSize="20" ScrollViewer.VerticalScrollBarVisibility="Auto"/> </StackPanel> </Grid> </Grid>

    ListView인 lv_DB는 상위의 Grid와 StackPanel로부터 자동적으로 차례대로 Height값을 받아 적용되어 정확히 그 크기만큼을 갖은 후에는 Scrollbar를 생성해야 하도록 코딩한 것 같습니다만... lv_DB의 item.add를 통하여 아이템을 추가하게되면 스크롤바는 생기지 않고 ListView가 무한적으로 커져버리는 현상이 생깁니다.

    그래서 뭐가 문제인가 확인을 해보았더니 lv_DB의 Height를 상단의 Grid -> StackPanel로부터 받지 못하고 NaN값을 갖는 것으로 확인하였습니다. 이는 item의 add를 통할 경우 변동이 가능하기 때문인 것으로 충분히 이해하고 있기 때문에 이를 MaxHeight로 고정하여야 할 것 같습니다. 하지만 모니터의 해상도가 변경될 때마다 lv_DB를 감싸고 있는 Grid와 StackPanel의 크기역시 유동적으로 변하기 때문인지 Height값이 NaN을 갖고 있어 코드상에서의 적용을 어떻게야 할지 잘 모르겠습니다.

    만약 다음과 같은 코드처럼,

        <ScrollViewer><!--추가-->
            <StackPanel>
                <TextBlock Text="Postgre 읽기 테스트" FontSize="25" Height="30"/>
                <Button x:Name="btn_DB" FontSize="20" Content="Tblkorea Read 테스트 버튼" Click="btn_DB_Click"/>
                <ListView x:Name="lv_DB" FontSize="20" ScrollViewer.VerticalScrollBarVisibility="Auto"/>
            </StackPanel>
        </ScrollViewer><!--추가-->

    ScrollViewer로 StackPanel을 감싸면 다음 그림과 같이 스크롤바를 사용할 수 있으나, TextBlock과 Button까지 모두 스크롤뷰어로 묶여 하단의 제가 원하는 레이아웃이 아니게 됩니다. 또한 ScrollViewer로 StackPanel을 감싸지 않고 ListView인 lv_DB만 감쌀경우 상단의 제시한 문제와 동일한 문제가 발생합니다.

    여러 고수님들의 조언을 구해봅니다. 감사합니다.

    2012년 12월 28일 금요일 오전 12:57

답변

  • 자동 레이아웃을 구성할 때 StackPanel이 끼어 있으면 영역 채우기가 잘 작동하지 않을 때가 있습니다.

    말씀하신 상황의 경우에는 StackPanel을 Grid로 변경하시고 Row를 3개 추가해서 UI를 구성하시면 해결이 될 겁니다.

    이 때, 첫번째와 두번 째 Row는 auto로 세번째 Row는 *로 하신 후 ListView를 세번째 Row로 설정하시면 됩니다.

    이렇게 변경하시면 별도의 ScrollViewer없이도 ListView에서 스크롤바가 정상적으로 작동할 겁니다.

    • 답변으로 표시됨 와메바 2013년 1월 3일 목요일 오전 12:22
    2013년 1월 2일 수요일 오전 9:53

모든 응답

  • 자동 레이아웃을 구성할 때 StackPanel이 끼어 있으면 영역 채우기가 잘 작동하지 않을 때가 있습니다.

    말씀하신 상황의 경우에는 StackPanel을 Grid로 변경하시고 Row를 3개 추가해서 UI를 구성하시면 해결이 될 겁니다.

    이 때, 첫번째와 두번 째 Row는 auto로 세번째 Row는 *로 하신 후 ListView를 세번째 Row로 설정하시면 됩니다.

    이렇게 변경하시면 별도의 ScrollViewer없이도 ListView에서 스크롤바가 정상적으로 작동할 겁니다.

    • 답변으로 표시됨 와메바 2013년 1월 3일 목요일 오전 12:22
    2013년 1월 2일 수요일 오전 9:53
  • 아... 감사합니다. WPF를 자주 사용하지 않아 StackPanel과 Grid를 자주 사용하지 않다보니까 상대적인 이해도가 적었던 것 같습니다. 말씀해주시는 것 처럼 StackPanel은 영역채우기가 동작하지 않는 경우가 많은 것 같습니다. 일종의 버그라고 보아도 될까요? 일단은 도움주신 방법으로 해결되었습니다.


    • 편집됨 와메바 2013년 1월 3일 목요일 오전 12:25
    2013년 1월 3일 목요일 오전 12:24