WPF Effect Clip以及Transform


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

這樣窗體就可以自由拖動了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM