WPF ListView Scrollbar Header 영역 침범 질문드립니다.

ListView의 기본 템플릿을 변경해가면서 쓰는 도중 VerticalScrollBar의 위랑 아래 버튼을 Visibility=“Collapsed” 해서 지웠는데 버튼이 있던 곳이 헤더쪽이라 그런지 영역이 남더라구요 혹시 헤더쪽에 침범 못하도록 할 수 없을까요?

2개의 좋아요

템플릿 전체 내용을 첨부해 주셔야 답변이 가능할 것 같습니다.

2개의 좋아요
 <Style x:Key="ScrollBarStyle1" TargetType="{x:Type ScrollBar}">
     <Setter Property="Stylus.IsPressAndHoldEnabled" Value="false"/>
     <Setter Property="Stylus.IsFlicksEnabled" Value="false"/>
     <!--<Setter Property="Background" Value="{StaticResource ScrollBar.Static.Background}"/>-->
     <Setter Property="Background" Value="#14171D"/>
     <Setter Property="BorderBrush" Value="#000000"/>
     <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
     <Setter Property="BorderThickness" Value="0,2,0,0"/>
     <!--<Setter Property="Width" Value="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}"/>
     <Setter Property="MinWidth" Value="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}"/>-->
     <Setter Property="Width" Value="10"/>
     <Setter Property="MinWidth" Value="14"/>
     <Setter Property="Template">
         <Setter.Value>
             <ControlTemplate TargetType="{x:Type ScrollBar}">
                 <Grid x:Name="Bg" SnapsToDevicePixels="true">
                     <Grid.RowDefinitions>
                         <!-- 스크롤바 크기 조절-->
                         <RowDefinition MaxHeight="13.2"/>
                         <RowDefinition Height="0.00001*"/>
                         <RowDefinition MaxHeight="0"/>
                     </Grid.RowDefinitions>
                     <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Grid.Row="1"/>
                     <!--스크롤 위에 버튼 삭제 -->
                     <RepeatButton x:Name="PART_LineUpButton" Command="{x:Static ScrollBar.LineUpCommand}" IsEnabled="{TemplateBinding IsMouseOver}" Style="{StaticResource ScrollBarButton}" Visibility="Collapsed">
                         <Path x:Name="ArrowTop" Data="M 0,4 C0,4 0,6 0,6 0,6 3.5,2.5 3.5,2.5 3.5,2.5 7,6 7,6 7,6 7,4 7,4 7,4 3.5,0.5 3.5,0.5 3.5,0.5 0,4 0,4 z" Fill="{StaticResource ScrollBar.Static.Glyph}" Margin="3,4,3,3" Stretch="Uniform"/>
                     </RepeatButton>
                     <Track x:Name="PART_Track" IsDirectionReversed="true" IsEnabled="{TemplateBinding IsMouseOver}" Grid.Row="1">
                         <Track.DecreaseRepeatButton>
                             <RepeatButton Command="{x:Static ScrollBar.PageUpCommand}" Style="{StaticResource RepeatButtonTransparent}" Visibility="Collapsed"/>
                         </Track.DecreaseRepeatButton>
                         <Track.IncreaseRepeatButton>
                             <RepeatButton Command="{x:Static ScrollBar.PageDownCommand}" Style="{StaticResource RepeatButtonTransparent}" Visibility="Collapsed"/>
                         </Track.IncreaseRepeatButton>
                         <Track.Thumb>
                             <Thumb Style="{StaticResource ScrollBarThumbVertical}"/>
                         </Track.Thumb>
                     </Track>
                     <!--스크롤 아래 버튼 삭제-->
                     <RepeatButton x:Name="PART_LineDownButton" Command="{x:Static ScrollBar.LineDownCommand}" IsEnabled="{TemplateBinding IsMouseOver}" Grid.Row="2" Style="{StaticResource ScrollBarButton}" Visibility="Collapsed">
                         <Path x:Name="ArrowBottom" Data="M 0,2.5 C0,2.5 0,0.5 0,0.5 0,0.5 3.5,4 3.5,4 3.5,4 7,0.5 7,0.5 7,0.5 7,2.5 7,2.5 7,2.5 3.5,6 3.5,6 3.5,6 0,2.5 0,2.5 z" Fill="{StaticResource ScrollBar.Static.Glyph}" Margin="3,4,3,3" Stretch="Uniform"/>
                     </RepeatButton>
                 </Grid>
                 <ControlTemplate.Triggers>
                     <MultiDataTrigger>
                         <MultiDataTrigger.Conditions>
                             <Condition Binding="{Binding IsMouseOver, ElementName=PART_LineDownButton}" Value="true"/>
                             <Condition Binding="{Binding IsPressed, ElementName=PART_LineDownButton}" Value="true"/>
                         </MultiDataTrigger.Conditions>
                         <Setter Property="Fill" TargetName="ArrowBottom" Value="{StaticResource ScrollBar.Pressed.Glyph}"/>
                     </MultiDataTrigger>
                     <MultiDataTrigger>
                         <MultiDataTrigger.Conditions>
                             <Condition Binding="{Binding IsMouseOver, ElementName=PART_LineUpButton}" Value="true"/>
                             <Condition Binding="{Binding IsPressed, ElementName=PART_LineUpButton}" Value="true"/>
                         </MultiDataTrigger.Conditions>
                         <Setter Property="Fill" TargetName="ArrowTop" Value="{StaticResource ScrollBar.Pressed.Glyph}"/>
                     </MultiDataTrigger>
                     <MultiDataTrigger>
                         <MultiDataTrigger.Conditions>
                             <Condition Binding="{Binding IsMouseOver, ElementName=PART_LineDownButton}" Value="true"/>
                             <Condition Binding="{Binding IsPressed, ElementName=PART_LineDownButton}" Value="false"/>
                         </MultiDataTrigger.Conditions>
                         <Setter Property="Fill" TargetName="ArrowBottom" Value="{StaticResource ScrollBar.MouseOver.Glyph}"/>
                     </MultiDataTrigger>
                     <MultiDataTrigger>
                         <MultiDataTrigger.Conditions>
                             <Condition Binding="{Binding IsMouseOver, ElementName=PART_LineUpButton}" Value="true"/>
                             <Condition Binding="{Binding IsPressed, ElementName=PART_LineUpButton}" Value="false"/>
                         </MultiDataTrigger.Conditions>
                         <Setter Property="Fill" TargetName="ArrowTop" Value="{StaticResource ScrollBar.MouseOver.Glyph}"/>
                     </MultiDataTrigger>
                     <Trigger Property="IsEnabled" Value="false">
                         <Setter Property="Fill" TargetName="ArrowTop" Value="{StaticResource ScrollBar.Disabled.Glyph}"/>
                         <Setter Property="Fill" TargetName="ArrowBottom" Value="{StaticResource ScrollBar.Disabled.Glyph}"/>
                     </Trigger>
                 </ControlTemplate.Triggers>
             </ControlTemplate>
         </Setter.Value>
     </Setter>
     <Style.Triggers>
         <Trigger Property="Orientation" Value="Horizontal">
             <Setter Property="Width" Value="Auto"/>
             <Setter Property="MinWidth" Value="0"/>
             <!--<Setter Property="Height" Value="{DynamicResource {x:Static SystemParameters.HorizontalScrollBarHeightKey}}"/>
             <Setter Property="MinHeight" Value="{DynamicResource {x:Static SystemParameters.HorizontalScrollBarHeightKey}}"/>-->
             <Setter Property="Height" Value="10"/>
             <Setter Property="MinHeight" Value="14"/>
             <Setter Property="BorderThickness" Value="0,1"/>
             <Setter Property="Margin" Value="-13,0,0,0"/>
             <Setter Property="Template">
                 <Setter.Value>
                     <ControlTemplate TargetType="{x:Type ScrollBar}">
                         <Grid x:Name="Bg" SnapsToDevicePixels="true">
                             <Grid.ColumnDefinitions>
                                 <!--Horizontal 스크롤바 크기 조절-->
                                 <ColumnDefinition MaxWidth="13.2"/>
                                 <ColumnDefinition Width="0.00001*"/>
                                 <ColumnDefinition MaxWidth="0"/>
                             </Grid.ColumnDefinitions>
                             <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Grid.Column="1"/>
                             <RepeatButton x:Name="PART_LineLeftButton" Command="{x:Static ScrollBar.LineLeftCommand}" IsEnabled="{TemplateBinding IsMouseOver}" Style="{StaticResource ScrollBarButton}" Visibility="Collapsed">
                                 <Path x:Name="ArrowLeft" Data="M 3.18,7 C3.18,7 5,7 5,7 5,7 1.81,3.5 1.81,3.5 1.81,3.5 5,0 5,0 5,0 3.18,0 3.18,0 3.18,0 0,3.5 0,3.5 0,3.5 3.18,7 3.18,7 z" Fill="{StaticResource ScrollBar.Static.Glyph}" Margin="3" Stretch="Uniform"/>
                             </RepeatButton>
                             <Track x:Name="PART_Track" Grid.Column="1" IsEnabled="{TemplateBinding IsMouseOver}">
                                 <Track.DecreaseRepeatButton>
                                     <RepeatButton Command="{x:Static ScrollBar.PageLeftCommand}" Style="{StaticResource RepeatButtonTransparent}"/>
                                 </Track.DecreaseRepeatButton>
                                 <Track.IncreaseRepeatButton>
                                     <RepeatButton Command="{x:Static ScrollBar.PageRightCommand}" Style="{StaticResource RepeatButtonTransparent}"/>
                                 </Track.IncreaseRepeatButton>
                                 <Track.Thumb>
                                     <Thumb Style="{StaticResource ScrollBarThumbHorizontal}"/>
                                 </Track.Thumb>
                             </Track>
                             <RepeatButton x:Name="PART_LineRightButton" Command="{x:Static ScrollBar.LineRightCommand}" Grid.Column="2" IsEnabled="{TemplateBinding IsMouseOver}" Style="{StaticResource ScrollBarButton}" Visibility="Collapsed">
                                 <Path x:Name="ArrowRight" Data="M 1.81,7 C1.81,7 0,7 0,7 0,7 3.18,3.5 3.18,3.5 3.18,3.5 0,0 0,0 0,0 1.81,0 1.81,0 1.81,0 5,3.5 5,3.5 5,3.5 1.81,7 1.81,7 z" Fill="{StaticResource ScrollBar.Static.Glyph}" Margin="3" Stretch="Uniform"/>
                             </RepeatButton>
                         </Grid>
                         <ControlTemplate.Triggers>
                             <MultiDataTrigger>
                                 <MultiDataTrigger.Conditions>
                                     <Condition Binding="{Binding IsMouseOver, ElementName=PART_LineRightButton}" Value="true"/>
                                     <Condition Binding="{Binding IsPressed, ElementName=PART_LineRightButton}" Value="true"/>
                                 </MultiDataTrigger.Conditions>
                                 <Setter Property="Fill" TargetName="ArrowRight" Value="{StaticResource ScrollBar.Pressed.Glyph}"/>
                             </MultiDataTrigger>
                             <MultiDataTrigger>
                                 <MultiDataTrigger.Conditions>
                                     <Condition Binding="{Binding IsMouseOver, ElementName=PART_LineLeftButton}" Value="true"/>
                                     <Condition Binding="{Binding IsPressed, ElementName=PART_LineLeftButton}" Value="true"/>
                                 </MultiDataTrigger.Conditions>
                                 <Setter Property="Fill" TargetName="ArrowLeft" Value="{StaticResource ScrollBar.Pressed.Glyph}"/>
                             </MultiDataTrigger>
                             <MultiDataTrigger>
                                 <MultiDataTrigger.Conditions>
                                     <Condition Binding="{Binding IsMouseOver, ElementName=PART_LineRightButton}" Value="true"/>
                                     <Condition Binding="{Binding IsPressed, ElementName=PART_LineRightButton}" Value="false"/>
                                 </MultiDataTrigger.Conditions>
                                 <Setter Property="Fill" TargetName="ArrowRight" Value="{StaticResource ScrollBar.MouseOver.Glyph}"/>
                             </MultiDataTrigger>
                             <MultiDataTrigger>
                                 <MultiDataTrigger.Conditions>
                                     <Condition Binding="{Binding IsMouseOver, ElementName=PART_LineLeftButton}" Value="true"/>
                                     <Condition Binding="{Binding IsPressed, ElementName=PART_LineLeftButton}" Value="false"/>
                                 </MultiDataTrigger.Conditions>
                                 <Setter Property="Fill" TargetName="ArrowLeft" Value="{StaticResource ScrollBar.MouseOver.Glyph}"/>
                             </MultiDataTrigger>
                             <Trigger Property="IsEnabled" Value="false">
                                 <Setter Property="Fill" TargetName="ArrowLeft" Value="{StaticResource ScrollBar.Disabled.Glyph}"/>
                                 <Setter Property="Fill" TargetName="ArrowRight" Value="{StaticResource ScrollBar.Disabled.Glyph}"/>
                             </Trigger>
                         </ControlTemplate.Triggers>
                     </ControlTemplate>
                 </Setter.Value>
             </Setter>
         </Trigger>
     </Style.Triggers>
 </Style>

스크롤바의 템플릿은 이렇습니다
기본 ListView의 템플릿에 Bar 색상만 바꾸고 이제 위 아래 왼쪽 오른쪽 arrow Button 만 Visibility=“Collapsed” 시켰습니다 제가 하고싶은건 Collapsed를 해서 사라진 버튼의 자리를 없애던가
Thumb가 위아래로 움직일 수 있는 위치로 합치던가 하고싶습니다.

1개의 좋아요

세로, 가로 방향 템플릿에서 Grid.RowDefinition, Grid.ColumnDefinition 부분을 각각 삭제하시면 될 것 같네요ㅎ

2개의 좋아요

Grid.RowDefinition, Grid.ColumnDefinition 제거했더니 HorizontalBar는 괜찮아졌는데

VerticalBar가 헤더까지 침범했는데 어떻게 해야할까요?

1개의 좋아요

음… 현재 상황이라면 Grid Panel의 레이아웃 개념을 완전히 익히신 뒤에 구현을 진행하는 것이 좋을 것 같습니다 ㅎ

C# WPF 기초 강의(Layout - Grid) - YouTube

2개의 좋아요

@HongAhri

ScrollViewer같이 복잡한 컨트롤을 재구성하는 것은 생각보다 어렵습니다. 그래서 @al6uiz 말씀해주신 것처럼 Grid와 같은 레이아웃을 제대로 이해하고 유연하게 구사하는 것이 아주 중요해요.

그리고 이런 경우는 GitHub 통해 재현 가능한 소스코드를 올려주시면 아주 좋습니다.

1개의 좋아요