UWP 對 Thickness 型別屬性進行動畫

2021-09-07 20:45:09 字數 2984 閱讀 9947

原文:

【uwp】對 thickness 型別屬性進行動畫

在 uwp 中,出於效能考慮,微軟是不建議、不推薦對會影響布局的屬性進行動畫的。例如 width 和 height 這種,如果真的需要對這些屬性進行動畫的話(畢竟需求就擺在那裡),可以將 animation 的 enabledependentanimation 屬性設定為 true 來對這些屬性進行動畫的。

但是,對於 thickness 型別來說,這是行不通的,因為 uwp 中並沒有 thicknessanimation 這種動畫型別(ps:wpf 裡是有這種動畫型別的說)。

不過既然我標題都寫了出來,那辦法肯定是有的。thickness 就是四個方向分量,也就是說,對這四個方向分量進行動畫就等於對這個 thickness 進行了動畫。

還有另外一點要注意的是,thickness 型別的四個屬性並不是依賴屬性。

例如:

control.margin.left = 10;
這一句是沒有效果的。

要實現效果,只能對 margin 屬性從新賦乙個值:

var margin =control.margin;

margin.left = 10

;control.margin = margin;

也就是說,我們需要乙個可繫結的 margin。(我就叫它 bindablemargin)

新建乙個使用者控制項

為什麼是使用者控制項?因為經過我的發現,我們自定義的類的依賴屬性,得有 xaml 檔案才能進行動畫。(不信你可以試試^-^)

然後修改 bindablemargin.xaml 如下:

<

dependencyobject

x:class

="animatethicknessdemo.bindablemargin"

xmlns

=""xmlns:x

=""xmlns:d

=""xmlns:mc

=""mc:ignorable

="d"

/>

相當簡單的一段 xaml,設計器就無視好了。重點在 bindablemargin.xaml.cs 裡,修改**:

public

partial

class

bindablemargin

_owner =owner;

}public

double

bottom

return

ownerbottom;

}set }

public

double

left

return

ownerleft;

}set }

public

double

right

return

ownerright;

}set }

public

double

top

return

ownertop;

}set }

private

static

void

bottomchanged(dependencyobject d, dependencypropertychangedeventargs e)

private

static

void

leftchanged(dependencyobject d, dependencypropertychangedeventargs e)

private

static

void

rightchanged(dependencyobject d, dependencypropertychangedeventargs e)

private

static

void

topchanged(dependencyobject d, dependencypropertychangedeventargs e)

}

別看**這麼多,其實不複雜。建構函式傳入需要動畫的控制項。然後四個方向的依賴屬性,值發生改變時回寫到控制項上。

然後動畫的例子**:

bindablemargin margin = new

bindablemargin(control);

doubleanimation animation = new

doubleanimation();

animation.enabledependentanimation = true

;animation.from = 0

;animation.to = 100

;animation.duration = timespan.fromseconds(1

);storyboard.settarget(animation, margin);

storyboard.settargetproperty(animation,

"left

");

await storyboard.beginasync();//

winrtxamltoolkit 裡的擴充套件方法。

margin.left = 100;

說了這麼多,還是說說有啥應用吧。

這是乙個類似 it 之家的通知控制項。通過動畫了 margin 的 right 來實現的。

當然應用還有很多,例如對 border 的圓角進行動畫。通過這麼一種「橋」的方式,我們可以對很多屬性,並不侷限於 thickness 型別,也進行動畫,這裡就留給各位看官發揮想象了。

UWP 區分裝置型別

在寫uwp應用時,通常會需要在 裡面判斷當前是什麼裝置型別,以便在不同的裝置上顯示出不同的效果或者內容。1.通常我們都知道如何在c 裡面去判斷 public static deviceformfactortype getdeviceformfactortype 2.windows community...

WP8 1 UWP手機裝置對狀態列操作

改uwp和wp8.1手機裝置的狀態列。首先先說較為普遍的wp8.1裝置 首先新增引用 using windows.ui.viewmanagement 其次就可以使用 statusbar了,它提供了以下方法 statusbar statusbar statusbar.getforcurrentview...

對匿名型別的幻想

在激動了五分鐘後的惆悵 匿名型別了解已久,今天真的用了才發現,有點點雞肋。首先它的作用域只在方法內部,對方法外部只能先轉換為object,這個時候對它就真的是匿名了。msdn說到 匿名型別 具有方法範圍。若要向方法邊界外部傳遞乙個 匿名型別 或乙個包含 匿名型別 的集合,必須首先將 匿名型別 強制轉...