《15天玩轉WPF》—— 圖形的效果與變形

致敬最美逆行者,英雄一路走好,好好學習,回報祖國 . . .


不出意外,這是《WPF核心知識》系列文章的倒數第三篇文章 . . .
通過對《深入淺出WPF》書籍的閱讀,我學到了許多的知識,在此感謝劉老師 . . .
我爲什麼把每篇博客稱爲 “飛天入地" 呢? 一來是我真的很喜歡這門技術,二來我真的很喜歡這六技術 . . .


此篇博文主要講解圖形的效果與變形,比如爲:

  • 圖形進行添加 —— 模糊、陰影效果
  • 對圖形進行位移、旋轉等效果

WPF的出現可謂是我們的福音,因爲像模糊、陰影、位移、旋轉這樣的效果,我們只需要改變幾個屬性的值就行了,而不需要使用 Photoshop這樣的專業設計工具 . . .

下面我們來講一講文章提到的四種效果怎麼用吧 . . .

.


在UIElement類的成員中有兩個屬性: BitmapEffect 和 Effect這兩個屬性,這兩個屬性都可以爲UI元素添加效果,那爲什麼有兩個屬性呢?因爲早期的是 BitmapEffect,是用CPU的運算能力爲 UI元素添加效果,這樣會造成程序的性能降低,所以後來添加了 Effect這個屬性,它使用GPU的運算能力爲 UI元素添加效果 . . .

此文章只講述 Effect的簡單使用,BitmapEffect已經被淘汰了,但大家可以查閱文檔進行測試 . . .

.


圖形的效果

Effect 類有三個派生類,它們是:

  • BlurEffect:模糊效果
  • DropShadowEffect:投影效果
  • ShaderEffect:着色器效果(抽象類)

我們可以對 ShaderEffect類進行開發,可以爲圖形添加各種濾鏡效果,此文不會講解 . . .

下面我們來使用前兩個派生類,來爲 UI元素添加效果吧 . . .

陰影效果:

<Button Width="160" Height="50" Content="Hello">
            <Button.Effect>
                <DropShadowEffect Direction="-45" Opacity="0.5" Color="Red"
                 	ShadowDepth="10"/>
            </Button.Effect>
</Button>

我們設置了DropShadowEffect 效果的屬性是:

  • Direction:陰影方向
  • Opacity:不透明度
  • ShadowDepth:陰影深度

效果如下圖所示:

在這裏插入圖片描述

.

模糊效果:

<Button Grid.Row="1" Width="160" Height="50" Content="Hello">
            <Button.Effect>
                <BlurEffect Radius="10" KernelType="Gaussian"/>
            </Button.Effect>
</Button>

我們設置了BlurEffect 效果的屬性是:

  • Radius:模糊效果曲線的半徑
  • KernelType:計算模糊的曲線的值

效果如下圖所示:

在這裏插入圖片描述

.


圖形的變形

控制變形的屬性有兩個,分別是:

  • RenderTransform:呈現變形
  • LayoutTransform:佈局變形

它們分別派生自 UIElement、FrameworkElement類,所以在控件級別兩個屬性你都能看到 . . .

它們的數據類型都是 Transform抽象類,我們可以用 Transform 類的派生類用於爲這兩個屬性。

ransform 抽象類的派生類有如下一些:

  • MatrixTransform:矩陣變形
  • RotateTransform:旋轉變形
  • ScaleTransform:座標系變形
  • SkewTransform:拉伸變形
  • TranslateTransform:偏移變形
  • TransformGroup:變形組(多個獨立變形放在一起)

.

呈現變形(RenderTransform)

質變本不變,不影響界面的佈局效果 . . .

下面讓我們實例來體驗一下這種變形方式吧 . . .

我們使用 RenderTransform來使 Button旋轉並移動到指定位置,注意觀察界面的佈局

<Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
</Grid.RowDefinitions>

<Button Width="80" HorizontalAlignment="Left" VerticalAlignment="Top" Height="80"
	 Content="Hello">
            <Button.RenderTransform>
                <TransformGroup>
                    <RotateTransform CenterX="40" CenterY="40" Angle="45"/>
                    <TranslateTransform X="300" Y="200"/>
                </TransformGroup>
            </Button.RenderTransform>
</Button>

這個XAML代碼,首先我們對界面進行了佈局,第一行第一列的大小爲默認大小,然後 Button按鈕被默認放在其中,之後我們對 Button進行旋轉 + 位移變形,效果如下:

在這裏插入圖片描述

我們在這個界面佈局中發現,第一行第一列還是 這個 Button的大小,這就是 RenderTransform,質變本不變,這種做可以提高程序的效率,因爲一但使界面佈局發生了變化,各種算法都會重新計算 . . .

.

佈局變形

因爲對佈局的變形會影響到程序的性能,所以我們一般只用在靜態變形中,而不用於製作動畫(下一篇博文會講) . . .

我們來實現一個文字縱向排列的淺藍色標題欄 . . .

方便我們更好的學習,我們使用 呈現變形,代碼如下:

<Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>

<Grid x:Name="titleBar" Background="LightBlue">
            <TextBlock Text="Hello Transformer!" FontSize="24"
                       HorizontalAlignment="Left" VerticalAlignment="Bottom">
                <TextBlock.RenderTransform>
                    <RotateTransform Angle="-90"/>
                </TextBlock.RenderTransform>
            </TextBlock>
</Grid>

效果如下:

在這裏插入圖片描述

和上面的那個例子一樣,本身並沒有發生變化 . . .

.

因爲我們需要的是靜態改變 TextBlock的佈局,所以我們應該使用 LayoutTransform,我們只需要改變其中的一處就行:

<Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>

<Grid x:Name="titleBar" Background="LightBlue">
            <TextBlock Text="Hello Transformer!" FontSize="24"
                       HorizontalAlignment="Left" VerticalAlignment="Bottom">
                <TextBlock.LayoutTransform>
                    <RotateTransform Angle="-90"/>
                </TextBlock.LayoutTransform>
            </TextBlock>
</Grid>

我們只是把 RenderTransform 改成了 LayoutTransform了而已,效果如下:

在這裏插入圖片描述

.


作者:浪子花夢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章