如何创建WPF圆角容器?

Far*_*ver 106 wpf rounded-corners

我们正在创建一个XBAP应用程序,我们需要在单个页面中的不同位置具有圆角,并且我们希望有一个WPF Rounded Corner容器来放置一堆其他元素.有没有人对我们如何才能最好地完成这项工作有一些建议或示例代码?使用样式或创建自定义控件?

kob*_*usb 251

您不需要自定义控件,只需将容器放在border元素中:

<Border BorderBrush="#FF000000" BorderThickness="1" CornerRadius="8">
   <Grid/>
</Border>
Run Code Online (Sandbox Code Playgroud)

您可以替换<Grid/>任何布局容器...

  • 对于任何厚度对象(BorderThickness或CornerRadius),如果所有4都相同,则可以指定单个数字,例如CornerRadius ="8". (29认同)
  • 好吧,我通过增加边框厚度来实现它,但是这个解决方案不会剪切容器内儿童的角落.它仅通过限制儿童的高度和宽度来防止角落与边界半径重叠.Chris Cavanagh的解决方案处理这个案例.可悲的是,我希望这个解决方案有效,因为它似乎更有效和优雅. (7认同)
  • `<Border BorderBrush ="Black"BorderThickness ="1"CornerRadius ="8">`是一个合适的替代品,更多的是succint (3认同)

cpl*_*tts 51

我知道这不是最初问题的答案......但是你经常想要剪辑刚刚创建的圆角边界的内部内容.

Chris Cavanagh提出了一个很好的方法来做到这一点.

我尝试了几种不同的方法......我觉得这个方法很震撼.

这是下面的xaml:

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Background="Black"
>
    <!-- Rounded yellow border -->
    <Border
        HorizontalAlignment="Center"
        VerticalAlignment="Center"
        BorderBrush="Yellow"
        BorderThickness="3"
        CornerRadius="10"
        Padding="2"
    >
        <Grid>
            <!-- Rounded mask (stretches to fill Grid) -->
            <Border
                Name="mask"
                Background="White"
                CornerRadius="7"
            />

            <!-- Main content container -->
            <StackPanel>
                <!-- Use a VisualBrush of 'mask' as the opacity mask -->
                <StackPanel.OpacityMask>
                    <VisualBrush Visual="{Binding ElementName=mask}"/>
                </StackPanel.OpacityMask>

                <!-- Any content -->
                <Image Source="http://chriscavanagh.files.wordpress.com/2006/12/chriss-blog-banner.jpg"/>
                <Rectangle
                    Height="50"
                    Fill="Red"/>
                <Rectangle
                    Height="50"
                    Fill="White"/>
                <Rectangle
                    Height="50"
                    Fill="Blue"/>
            </StackPanel>
        </Grid>
    </Border>
</Page>
Run Code Online (Sandbox Code Playgroud)


cpl*_*tts 14

我必须自己这样做,所以我想我会在这里发布另一个答案.

这是另一种创建圆角边框并剪切其内部内容的方法.这是使用Clip属性的简单方法.如果你想避免使用VisualBrush,这很好.

xaml:

<Border
    Width="200"
    Height="25"
    CornerRadius="11"
    Background="#FF919194"
>
    <Border.Clip>
        <RectangleGeometry
            RadiusX="{Binding CornerRadius.TopLeft, RelativeSource={RelativeSource AncestorType={x:Type Border}}}"
            RadiusY="{Binding RadiusX, RelativeSource={RelativeSource Self}}"
        >
            <RectangleGeometry.Rect>
                <MultiBinding
                    Converter="{StaticResource widthAndHeightToRectConverter}"
                >
                    <Binding
                        Path="ActualWidth"
                        RelativeSource="{RelativeSource AncestorType={x:Type Border}}"
                    />
                    <Binding
                        Path="ActualHeight"
                        RelativeSource="{RelativeSource AncestorType={x:Type Border}}"
                    />
                </MultiBinding>
            </RectangleGeometry.Rect>
        </RectangleGeometry>
    </Border.Clip>

    <Rectangle
        Width="100"
        Height="100"
        Fill="Blue"
        HorizontalAlignment="Left"
        VerticalAlignment="Center"
    />
</Border>
Run Code Online (Sandbox Code Playgroud)

转换器的代码:

public class WidthAndHeightToRectConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        double width = (double)values[0];
        double height = (double)values[1];
        return new Rect(0, 0, width, height);
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)