在UIElement類的成員中可以找到BitmapEffect和Effect兩個屬性,這兩個屬性都用來為UI元素添加效果,MS的官方網站和一些開源網站上已經有很多效果類庫可以使用。Effect由於GPU加速,所以性能較好,可以說是Effect代替了BitmapEffect,不過在WPF4.0中BitmapEffect仍然可以使用。
<Button Width="200" Height="100" Background="Red" Content="DropShadowEffect" FontSize="20" Canvas.Left="125" Canvas.Top="0"> <Button.Effect> <DropShadowEffect BlurRadius="30" Color="Green" Direction="-45" /> </Button.Effect> </Button> <Button Background="Red" Canvas.Left="356" Canvas.Top="0" Content="BlurEffect" FontSize="20" Height="100" Width="100"> <Button.BitmapEffect> <BevelBitmapEffect BevelWidth="5" EdgeProfile="CurvedIn" LightAngle="10" Relief="10" Smoothness="10"/> </Button.BitmapEffect>
</Button>
Effect的可選值如下:
BitmapEffect的可選屬性如下:
WPF中Transform一詞含義很廣,位置、尺寸、坐標系比例、旋轉角度等的變化都算變形。
WPF中的變形與UI元素是分開的,舉個例子,可以設計一個“向左選作45度”的變形,然后把這個變形賦值給不同的UI元素的變形控制屬性,這些UI元素就都向左旋轉45度了。
控制變形的屬性有兩個,分別是:
RenderTransform:呈現變形,定義在UIElement類中。
LayoutTransform:布局變形,定義在FrameworkElement類中。
這兩個屬性都是依賴屬性,他們的數據類型都是Transform抽象類,Transform類的派生類均可用來為這兩個屬性賦值。
<Image Source="1.jpg" Canvas.Left="125" Canvas.Top="30" Height="380" Name="image1" Stretch="Fill" Width="229" > <Image.BitmapEffect> <BlurBitmapEffect KernelType="Gaussian" Radius="5" /> </Image.BitmapEffect> <Image.RenderTransform> <TransformGroup> <RotateTransform CenterX="40" CenterY="40" Angle="45"/> <TranslateTransform X="200" Y="200"/> </TransformGroup> </Image.RenderTransform> </Image>
Transform類的派生類有如下一些:
- MatrixTransform:矩陣變形,把容納被變形UI元素的矩陣點看做一個矩陣進行變形。
- RouteTransform:旋轉變形,以給定的點位旋轉中心,以角度為單位進行旋轉。
- ScaleTransform:坐標系變形,調整被變形元素的坐標系,可以產生縮放效果。
- SkewTransform:拉伸變形,可以在橫向和縱向上對變形元素進行拉伸。
- TranslateTransform:偏移變形,使被變形元素在橫向或縱向上偏移一個給定的值。
- TransformGroup:變形組,可以把多個獨立變形合成一個變形組、產生復合變形效果。
<TextBox Text="LayoutTransform" FontSize="30" > <TextBox.LayoutTransform> <RotateTransform Angle="-90"/> </TextBox.LayoutTransform> </TextBox>
在工作中經常會遇到制作不規則窗體或控件的需求,WPF在這方面做了很好的支持,僅需使用窗體或控件的Clip屬性就可以輕松做到。
Clip屬性被定義在UIElement中,一次WPF窗體和所有控件、圖形都具有這個屬性。Clip屬性的數據類型是Geometry,與Path的Data屬性一致。因此,我們只要按照需求只做好特殊形狀的Path並把Path的Data屬性賦值給窗體或控件的Clip屬性,對目標的裁剪就完成了。
在XAML中定義一個Path,如下:
<Path Visibility="Hidden" x:Name="clipPath" Data="M 55,100 A 50,50 0 1 1 100,60 A 110,95 0 0 1 200, 60 A 50,50 0 1 1 250,100 A 110,95 0 1 1 55,100 Z"/>
賦值:
window1.Clip = clipPath.Data;
就OK了,注意對於窗體需要設置這兩個屬性:
AllowsTransparency="True" WindowStyle="None"
效果如下:
下面讓這個窗體支持拖動,僅需要重寫OnMouseLeftButtonDown,如下:
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { base.OnMouseLeftButtonDown(e); //Point position = e.GetPosition(window1); if (e.LeftButton == MouseButtonState.Pressed) { this.DragMove(); } }
這樣窗體就可以自由拖動了。