修剪Canvas中的内容

用Canvas绘制图形时,如果图形的大小超过Canvas时也能够显示出来,如下图所示:

有时这种效果不是我们要的,如何能达到如下图所示的效果:

Xaml代码如下:

xmlns:util="clr-namespace:Util"

 

<Grid x:Name="LayoutRoot" Background="White" Margin="10">

<Grid.ColumnDefinitions>

<ColumnDefinition Width="*"/>

<ColumnDefinition Width="*"/>

</Grid.ColumnDefinitions>

<Canvas Grid.Column="0" Background="Aqua" Margin="20" >

<Ellipse Fill="Red" Canvas.Top="-20" Canvas.Left="-20" Width="200" Height="200"/>

</Canvas>

<Canvas Grid.Column="1" Background="Aqua" Margin="20" util:Clip.ToBounds="true">

<Ellipse Fill="Red" Canvas.Top="-20" Canvas.Left="-20" Width="200" Height="200"/>

</Canvas>

</Grid>

CS代码如下:

namespace Util

{

public class Clip

{

public static bool GetToBounds(DependencyObject depObj)

{

return (bool)depObj.GetValue(ToBoundsProperty);

}

 

public static void SetToBounds(DependencyObject depObj, bool clipToBounds)

{

depObj.SetValue(ToBoundsProperty, clipToBounds);

}

 

public static readonly DependencyProperty ToBoundsProperty =

DependencyProperty.RegisterAttached("ToBounds", typeof(bool),

typeof(Clip), new PropertyMetadata(false, OnToBoundsPropertyChanged));

 

private static void OnToBoundsPropertyChanged(DependencyObject d,

DependencyPropertyChangedEventArgs e)

{

FrameworkElement fe = d as FrameworkElement;

if (fe != null)

{

ClipToBounds(fe);

 

fe.Loaded += new RoutedEventHandler(fe_Loaded);

fe.SizeChanged += new SizeChangedEventHandler(fe_SizeChanged);

}

}

 

private static void ClipToBounds(FrameworkElement fe)

{

if (GetToBounds(fe))

{

fe.Clip = new RectangleGeometry()

{

Rect = new Rect(0, 0, fe.ActualWidth, fe.ActualHeight)

};

}

else

{

fe.Clip = null;

}

}

 

static void fe_SizeChanged(object sender, SizeChangedEventArgs e)

{

ClipToBounds(sender as FrameworkElement);

}

 

static void fe_Loaded(object sender, RoutedEventArgs e)

{

ClipToBounds(sender as FrameworkElement);

}

}

}

转载于:https://www.cnblogs.com/lyf681888/p/4024014.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值