在 wpf 裡,我們是可以在 relativesource 上面實現的,舉個例子:
<grid
tag="2"
>
<
button
>
<
grid
tag="1"
>
<
textblock
text
=", path=tag, mode=oneway}
"/>
grid
>
button
>
grid
>
將 relativesource 的 mode 設定為 findancestor 就可以了。ancestortype 代表繫結的型別,ancestorlevel 代表查詢第幾個,預設是 1。所以在上面的例子裡,由於 ancestorlevel 是 2,所以查詢出來的是 tag 等於 2 的那個 grid。假如設定成 3,那就查詢不到了。
但是,在 uwp 裡,微軟出於效能考慮,把 findancestor 給去掉了,relativesource 的 mode 只剩下了 self 和 templateparent。但是需求永遠是存在的,那麼總得有個解決方案吧,假如你搜尋過 google 或者 stackoverflow,無一不例外就是改成通過 elementname 來繫結,也就是上面的例子會變成如下這樣:
<grid
x:name
="targetgrid"
tag="2"
>
<
button
>
<
grid
tag="1"
>
<
textblock
text=""
/>
grid
>
button
>
grid
>
說實話這樣也能用,而且效能更好了,一直以來,我自己的 uwp 專案也是通過這種方式來解決。
<controls:imageex
x:name
="targetimage"
>
<
controls:imageex.loadingtemplate
>
<
datatemplate
>
<
progressbar
maximum
="1"
value=""
/>
datatemplate
>
controls:imageex.loadingtemplate
>
controls:imageex
>
這樣單個 imageex 就沒問題了,但是需求再進一步,我需要所有的 imageex 都是這樣,loadingtemplate 是一致的。在此刻,我們已經沒辦法通過繫結 elementname 的方式來解決問題了。
俗話說,不行就包一層。xaml 裡包一層的話,那就是 contentcontrol 了,這裡我們建立乙個叫 ancestorbindingassist 的模板控制項,繼承自 contentcontrol。
cs **如下:
publicclass
ancestorbindingassist : contentcontrol
public
intancestorlevel
public
type ancestortype
public
dependencyobject source
protected
override
void
private
static
void
onancestorlevelchanged(dependencyobject d, dependencypropertychangedeventargs e)
obj.updatesource();
}private
static
void
onancestortypechanged(dependencyobject d, dependencypropertychangedeventargs e)
private
void
updatesource()
}
ancestortype 和 ancestorlevel 兩個屬性跟 wpf 裡一致,然後提供乙個 source 屬性提供給下級繫結。在 ancestortype 或者 ancestorlevel 發生變化時,則呼叫 updatesource 方法重新整理 source。updatesource 方法裡的 getancestors 來自 winrtxamltoolkit。
xaml **的話就很簡單了,因為這裡只是包一層。
<style
targettype
="local:ancestorbindingassist"
>
<
setter
property
="template"
>
<
setter.value
>
<
controltemplate
targettype
="local:ancestorbindingassist"
>
<
contentpresenter
/>
controltemplate
>
setter.value
>
setter
>
style
>
<grid
tag="2"
>
<
button
>
<
grid
tag="1"
>
<
local:ancestorbindingassist
x:name
="bindingassist"
ancestorlevel
="2"
ancestortype
="grid"
>
<
textblock
text=""
/>
local:ancestorbindingassist
>
grid
>
button
>
grid
>
各位看官可能會吐槽,這跟直接繫結 elementname 好像沒啥區別,而且還更複雜了。但是這裡我們再舉上面我那個 imageex 的例子,現在我們想所有 imageex 復用 loadingtemplate 就可以這麼寫了:
<style
targettype
="controls:imageex"
>
<
setter
property
="loadingtemplate"
>
<
setter.value
>
<
datatemplate
>
<
local:ancestorbindingassist
x:name
="bindingassist"
ancestortype
="controls:imageex"
>
<
progressbar
maximum
="1"
value=""
/>
local:ancestorbindingassist
>
datatemplate
>
setter.value
>
setter
>
style
>
這樣就能所有的 imageex 都能復用 loadingtemplate 了。而這是簡單的繫結 elementname 所做不到的。
UWP連線mysql 實現資料遠端備份
昨晚吃飯的時候突然覺得我們這個uwp應該添個資料備份的功能,不然換手機,換電腦之後資料庫就全沒了.一開始是想用微軟提供的azure的,沒想到這玩意又沒什麼資料而且申請試用的時候還讓我交身份證 審核.誰知道要審核多久,於是我選擇了在自己的伺服器上搞個mysql服務,然後在uwp裡面連線上去.沒想到過程...
UWP 列表項寬度自適應的實現
在uwp開發中,我們常常用到兩個顯示列表的控制項 listview和gridview。而這兩個列表控制項在pc等大螢幕上如果能多列 智慧型 調整自己的大小 通常是根據當前視窗大小調整寬度 那麼使用者就會在同一螢幕內接收到更多資訊,同時空間的利用率得以提高,也會提高應用的視覺體驗。這是我的第一篇部落格...
UWP檔案寫入
使用c 開發uwp應用時,遇到乙個異常的問題 在部分win10裝置使用 file類 寫檔案失敗 看了下獲取可寫目錄的 沒問題,如下 有問題還望指正 string getwritablepath const 檢視該資料夾的許可權,讀寫許可權也都有,不知為何使用fwrite一直寫檔案失敗 哪位大神知曉,...