WPF

WPF[WPF] WindowChrome 와 Shadow 를 가진 창 만들기 [추가]

Chanhongv 2024. 10. 14. 11:13

Main Content 인 Grid 안에 Control 추가 시

상위 Border 범위를 침범하는 문제가 발생한다.

Grid 안에 ListView 를 추가한 모습

 

그래서 Clip 이라는 것을 적용시켜주어야한다.

xInnerBorder 안의 Grid 에 아래 xaml 코드를 입력하고 Converter 들을 추가해준다.

 <Grid.Clip>
     <RectangleGeometry RadiusX="{Binding Path=CornerRadius, ElementName=xInnerBoder, Converter={cv:GridRaidusClipConverter}}"
                        RadiusY="{Binding Path=CornerRadius, ElementName=xInnerBoder, Converter={cv:GridRaidusClipConverter}}">
         <RectangleGeometry.Rect>
             <MultiBinding Converter="{cv:GridClipConverter}">
                 <Binding Path="ActualWidth" RelativeSource="{RelativeSource AncestorType={x:Type Grid}}"/>
                 <Binding Path="ActualHeight" RelativeSource="{RelativeSource AncestorType={x:Type Grid}}"/>
             </MultiBinding>
         </RectangleGeometry.Rect>
     </RectangleGeometry>
 </Grid.Clip>
 
  public class GridClipConverter : MarkupExtension, IMultiValueConverter
 {
     public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
     {
         if (values.Length == 2 && values[0] is double width && values[1] is double height)
         {
             return new Rect(0, 0, width , height );
         }
         return Rect.Empty;
     }

     public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
     {
         throw new NotImplementedException();
     }

     public override object ProvideValue(IServiceProvider serviceProvider)
     {
         return this;
     }
 }

 public class GridRaidusClipConverter : MarkupExtension, IValueConverter
 {
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
     {
         if(value is CornerRadius radius)
         {
             if (radius == new CornerRadius())
             {
                 return 0;
             }
             else
             {
                 return 10;
             }
         }
         return 10;
     }

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
     {
         throw new NotImplementedException();
     }

     public override object ProvideValue(IServiceProvider serviceProvider)
     {
         return this;
     }
 }

 

 

 

그러면 상위 Border를 침범하지 않는다.