如何创建一个WPF圆角容器?

9 浏览
0 Comments

如何创建一个WPF圆角容器?

我们正在创建一个XBAP应用程序,我们需要在单个页面的多个位置拥有圆角,并且希望使用一个WPF圆角容器来放置一系列其他元素。有人对如何最好实现这一点有什么建议或示例代码吗?无论是在上使用样式,还是创建一个自定义控件都可以。

0
0 Comments

问题的出现原因:作者需要创建一个具有圆角的容器,并且需要裁剪其内部内容。

解决方法:使用Clip属性来创建一个具有圆角的边框,并裁剪其内部内容。这是一种直接的方法,如果要避免使用VisualBrush,则很好用。

我最近也需要做这个,所以我想在这里发表另一个答案。

下面是另一种创建具有圆角边框并裁剪其内部内容的方法。这是使用Clip属性的直接方法。如果你想避免使用VisualBrush,那么这个方法很好用。

以下是XAML代码:


    
        
            
                
                    
                    
                
            
        
    
    

以下是转换器的代码:

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();
    }
}

非常棒的解决方案。我正在为一个按钮创建一个控件模板,需要在不同的状态下同时具有外部发光和内部发光,这个方法帮助解决了这个问题。

0
0 Comments

如何创建一个WPF圆角容器?

问题的出现原因:在创建圆角边框后,通常需要对其内部内容进行裁剪。然而,WPF默认并不支持对内容进行裁剪,因此需要找到一种方法来实现这个功能。

解决方法:Chris Cavanagh提供了一个很好的解决方案,详见这里。他的解决方案通过使用VisualBrush作为不透明度掩码,实现了对内容的裁剪。以下是相应的XAML代码:


    
    
        
            
            
            
            
                
                
                    
                
                
                
                
                
                
            
        
    

此外,Blacklight Controls (blacklight.codeplex.com)还提供了一个名为ClippingBorder的小控件,它也允许你对内容进行圆角裁剪。ClippingBorder的一个好处是它不使用VisualBrush,这是一种性能开销较大的画刷。然而,ClippingBorder的实现在其默认的ControlTemplate中使用了4个ContentControl(分别对应四个角),因此不确定其性能是否比上述的VisualBrush方法更好。

如果需要进行内容裁剪,建议选择ClippingBorder作为解决方案。

这是唯一真正的方法!对于位于边框内部的元素来说,这应该是默认行为。

很高兴你喜欢这个答案。唯一的缺点是你使用了一个性能较重的VisualBrush。下面的另一个答案将向你展示如何避免使用VisualBrush...

0
0 Comments

如何创建一个WPF圆角容器?

问题的出现原因是有用户希望在WPF中创建一个圆角容器,但是不知道如何实现。解决方法是将容器放在一个边框元素中,并设置边框的属性来实现圆角效果。

解决方法如下:


   

你可以将``替换为任何布局容器。

对于任何厚度的对象(`BorderThickness`或`CornerRadius`),如果4个边都相同,你可以只指定一个数字,如`CornerRadius="8"`。

另外,``也是一个合适的替代方案,更简洁一些。

此外,有用户提到这种实现方式对于Canvas并不起作用,必须将`BorderThickness`设置得与`CornerRadius`一样大。

还有用户提到这种实现方式对于使用了.NET 4.5和StackPanel的情况并不起作用。

还有用户提到,通过增加边框的厚度可以使这种解决方法起作用,但是这个解决方法不能将容器内部的子元素的角落剪裁掉,只是通过限制子元素的高度和宽度来防止角落重叠边框半径。 Chris Cavanagh的解决方案可以处理这种情况。不幸的是,我希望这种解决方法有效,因为它似乎更高效和优雅。

0