如何为WPF中的Frame控件设置圆角边框效果
WPF Frame控件圆角实现方法
Frame本身没有内置圆角属性,直接设置参数不会生效,下面两种方案都能跑通,按需选就行:
方案1:外层嵌套Border(改动最小,兼容所有WPF版本)
不用改控件模板,直接在Frame外面套一层Border来做圆角和边框,改动量最小,适配你现在的代码:
- 把原Frame上的
BorderThickness、BorderBrush、Background这几个和视觉相关的属性,全部挪到外层Border上 - 给Border设置
CornerRadius属性,值就是你要的圆角大小,比如要12px圆角就写12 - 给Border加Clip裁剪,避免Frame里的内容溢出圆角边缘,露出直角毛边
- Frame自身只保留布局、事件、变换这类逻辑属性,把
Background设为透明、BorderThickness设为0,防止自带的直角边框挡住圆角效果
修改后的可直接用的代码:
<Border CornerRadius="12" BorderThickness="2" Background="Black" BorderBrush="#FFF0F0F0" MaxWidth="1920" MaxHeight="1080" Width="1292" Height="1040" HorizontalAlignment="Left" VerticalAlignment="Top" Visibility="Visible" Margin="240,0,0,0" RenderTransformOrigin="0.5,0.5"> <Border.Clip> <RectangleGeometry RadiusX="12" RadiusY="12" Rect="0,0,1292,1040"/> </Border.Clip> <Border.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform/> <TranslateTransform X="32" Y="20"/> </TransformGroup> </Border.RenderTransform> <Frame x:Name="frmSub2" NavigationUIVisibility="Hidden" Background="Transparent" BorderThickness="0" MouseLeftButtonDown="frmSub2_MouseLeftButtonDown" Foreground="White"/> </Border>
提示:改圆角大小的时候,把
CornerRadius和RectangleGeometry的RadiusX、RadiusY三个值同步改成一样的就行;如果Frame是自适应尺寸不是固定宽高,可以把Rect做个绑定自动适配Border尺寸,嫌麻烦直接用固定值也没问题。
方案2:重写控件模板(无额外嵌套,适合全局复用)
这个方案需要写个10行以内的简易转换器做尺寸适配,不想写额外代码直接用方案1就行。如果项目里多个地方都要用圆角Frame,不想每次都套一层Border,可以直接重写Frame的默认控件模板,把圆角逻辑内置到样式里,一次写好全局用。
先把下面的样式放到窗口资源或者App.xaml的全局资源里:
<Style x:Key="RoundedFrameStyle" TargetType="Frame"> <Setter Property="Foreground" Value="White"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Frame"> <Border Background="Black" BorderBrush="#FFF0F0F0" BorderThickness="2" CornerRadius="12"> <Border.Clip> <RectangleGeometry RadiusX="12" RadiusY="12"> <RectangleGeometry.Rect> <MultiBinding Converter="{StaticResource RectConverter}"> <Binding Path="ActualWidth" RelativeSource="{RelativeSource TemplatedParent}"/> <Binding Path="ActualHeight" RelativeSource="{RelativeSource TemplatedParent}"/> </MultiBinding> </RectangleGeometry.Rect> </RectangleGeometry> </Border.Clip> <ContentPresenter/> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style>
如果嫌写转换器麻烦,直接固定圆角和尺寸的话,把Rect的值写死就行,用的时候直接给Frame指定样式:
<Frame x:Name="frmSub2" Style="{StaticResource RoundedFrameStyle}" NavigationUIVisibility="Hidden" MaxWidth="1920" MaxHeight="1080" Width="1292" Height="1040" HorizontalAlignment="Left" VerticalAlignment="Top" Visibility="Visible" Margin="240,0,0,0" MouseLeftButtonDown="frmSub2_MouseLeftButtonDown" RenderTransformOrigin="0.5,0.5"> <Frame.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform/> <TranslateTransform X="32" Y="20"/> </TransformGroup> </Frame.RenderTransform> </Frame>
注意事项
- 如果Frame内部加载的Page自己设置了背景色,记得把Page的Background设为透明,不然Page自带的直角背景会把圆角效果盖住
- 不要给Frame本身设置任何边框、背景属性,所有视觉效果都交给外层Border或者模板里的Border实现,避免直角穿帮
内容的提问来源于stack exchange,提问作者Heben Variuf
相关产品推荐
相关产品推荐

