You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:18:17