WPF之所以後續越來越多人使用,就是因為它的Dependency Property And Callback,甚至拉動Flex Windows的時候也不會讓圖片與元Dpi跑掉,以前的經驗表示… 在A端IDE跑得好好的外觀屬性,換到B端時…外觀屬性跑掉是家常便飯,一時之間會不知道是內層還是外部的設定屬性造成的(這個就會與WPF-Dependency Property有很大的關係)。
以前的NetFramework 沒有Dpi適應以及元件外觀沒有相依性可以跟著整個Solutioni走,所以開發WPF(Windows Presentation Foundation)的大神也肯定有察覺到這個超級不方便的地方。
資料來源:
https://skychang.github.io/2011/12/15/WPF-Dependency-Property-%E6%B7%B1%E5%85%A5%E6%8E%A2%E8%A8%8E/
在看Dependency Property之前,先來看看,以前的Property是什麼格式。
private double fntsize;
public double FontSize
{
get { return fntsize; }
set { fntsize = value; }
} 你如果使用這種動態的方式,還得去定義FontChangedEvent 再去RaiseEvent … 真的很痛苦!
WPF不需要這樣子搞了!
在Visual Studio中的Dependency Class中加入一個靜態Dependency Property。
DependencyProperty只能被封裝在繼承DependencyObject的物件中,幾乎在WPF或是Silverlight中看得到的控制項都繼承了DependencyObject,這跟我們之前用的 CLR屬性相差非常地多。
// 建立靜態DependencyProperty
// 相依屬性的元資料。這裡設定了初始值為 false,以及屬性值改變時要呼叫的方法
public static DependencyProperty IsBrownBkgrdProperty =
DependencyProperty.Register("IsBrownBkgrd", typeof(bool), typeof(MLStackPanel), new PropertyMetadata(false, OnIsBrownBkgrdChanged, CoerceIsBrownBkgrdChanged));
當我們必須操控Form 裡面的原件屬性,需按照我們定義的方式做變化時,我們可以在Dependency Property 註冊的地方新增一個…
內部可以多載的實體 PropertyMetadata ( Boolean,PropertyChangedCallBack, CoreceValueCallBack)
*可以想像它是被包裹在Dependency Property裡面的實體物件
Boolean
預先設定布林值
PropertyChangedCallBack
可改變實體元件的屬性值
CoreceValueCallBack
讀取目前元件底下的屬性值
namespace CustomDependencyProperty
{
class MLStackPanel : StackPanel
{
// 建立靜態DependencyProperty
// 相依屬性的元資料。這裡設定了初始值為 false,以及屬性值改變時要呼叫的方法
public static DependencyProperty IsBrownBkgrdProperty =
DependencyProperty.Register("IsBrownBkgrd", typeof(bool), typeof(MLStackPanel), new PropertyMetadata(false, OnIsBrownBkgrdChanged, CoerceIsBrownBkgrdChanged));
} namespace CustomDependencyProperty
{
class MLStackPanel : StackPanel
{
// 建立靜態DependencyProperty
// 相依屬性的元資料。這裡設定了初始值為 false,以及屬性值改變時要呼叫的方法
public static DependencyProperty IsBrownBkgrdProperty =
DependencyProperty.Register("IsBrownBkgrd", typeof(bool), typeof(MLStackPanel), new PropertyMetadata(false, OnIsBrownBkgrdChanged, CoerceIsBrownBkgrdChanged));
// 建立靜態物件 判斷StackPanel 控制項背景顏色
private static object CoerceIsBrownBkgrdChanged(DependencyObject d, object baseValue)
{
MLStackPanel m = d as MLStackPanel;
if (m.IsBrownBkgrd == false)
{
MessageBox.Show("The IsBrownBkgrd depdendency property is being changed to true");
return true;
}
else
{
MessageBox.Show("The IsBrownBkgrd depdendency property is being changed to false");
return false;
}
}
//CLR 屬性包裹
public bool IsBrownBkgrd
{
get { return (bool)GetValue(IsBrownBkgrdProperty); }
set { SetValue(IsBrownBkgrdProperty, value); }
}
當你建立完了MLStackPanel Class之後,我們會將這個Property加到我們的自訂控制項中(MainForm的XAML碼),讓我們更容易理解。
namespace CustomDependencyProperty
{
//繼承 控制項 StackPanel
class MLStackPanel : StackPanel
{
// 建立靜態DependencyProperty
// 相依屬性的元資料。這裡設定了初始值為 false,以及屬性值改變時要呼叫的方法
public static DependencyProperty IsBrownBkgrdProperty =
DependencyProperty.Register("IsBrownBkgrd", typeof(bool), typeof(MLStackPanel), new PropertyMetadata(false, OnIsBrownBkgrdChanged, CoerceIsBrownBkgrdChanged));
// 建立靜態物件 判斷StackPanel 控制項背景顏色
private static object CoerceIsBrownBkgrdChanged(DependencyObject d, object baseValue)
{
MLStackPanel m = d as MLStackPanel;
if (m.IsBrownBkgrd == false)
{
MessageBox.Show("The IsBrownBkgrd depdendency property is being changed to true");
return true;
}
else
{
MessageBox.Show("The IsBrownBkgrd depdendency property is being changed to false");
return false;
}
}
//CLR 屬性包裹
public bool IsBrownBkgrd
{
get { return (bool)GetValue(IsBrownBkgrdProperty); }
set { SetValue(IsBrownBkgrdProperty, value); }
}
// 靜態判斷物件
private static object CoerceIsBrownBkgrdChanged(DependencyObject d, object baseValue)
{
MLStackPanel m = d as MLStackPanel;
if (m.IsBrownBkgrd == false)
{
MessageBox.Show("The IsBrownBkgrd depdendency property is being changed to true");
return true;
}
else
{
MessageBox.Show("The IsBrownBkgrd depdendency property is being changed to false");
return false;
}
}
// OnIsBrownBkgrdChanged 方法
private static void OnIsBrownBkgrdChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
MLStackPanel msp = source as MLStackPanel;
if (msp.IsBrownBkgrd == true)
{
msp.Background = System.Windows.Media.Brushes.BurlyWood;
}
else
{
msp.Background = System.Windows.Media.Brushes.LightGray;
}
}
}
我們得把專案挪用到任何VS的環境,它都能幫助我且準確的保留上一個開發者的外觀樣式。
<local:ClassName>:將已經繼承控制項類別的Class 引入 <Grid>
<local:MLStackPanel x:Name="mlStack" IsBrownBkgrd="true" >
<CheckBox x:Name="chkBkgColor" Content="Brown Background" IsChecked="True" Margin="77,117,0,0" Click="bkgColor_Click" />
</local:MLStackPanel>
</Grid>
import 與 export 在Node.js 有提到其用法: Node.js require、module以及exports 模組設定 - Hugo Habor 每一個Javascript檔案可當作獨立模組系統(ES Module) 1. Module(模組)…
作者今天遇到一個很奇怪的問題 寫程式寫到一半... 點擊應用程式時... 怎麼都跳不出畫面... 後來查詢了一下是Reg註冊可能被微軟更新給搞掉了... 文章資訊來源: 【以解決】各位.exe檔案打不開,不要相信"在 Windows 7 或 Windows Vista 中無法打開 .EXE 檔案"這篇文章…
Node.js可以提供你很多模組,今天來探索如何使用 Node.js 的 http 模組來架設一個簡單的伺服器。 本篇使用模組require 載入你所需要的模組。這次我們使用'http' 模組來創造一個簡單的server。 資料參考 Node.js - createServer 起手式 - iT…
針對Node.js來談談 require、module以及exports 模組設定。這些概念允許開發者將大型程序分解成小的、可管理的、可重用的部分,稱為模塊。 下面將逐一介紹這些概念,以及它們如何與 JavaScript 關聯。 An Essential Guide to Node.js Modules (javascripttutorial.net) 1. Module(模組)…
像是很多專案必須讀取國家資料中心的metadata,許多檔案格式為CSV、JSON、Html可以利用網頁技術去爬蟲;拿一個範例來嘗試看看就知道這些語法的實際用途。 [主題週]專題報導-開放資料 (Open Data)相關議題與應用 (114230) - Cool3c 在這裡我們使用台北市資料大平台 UBike2.0 作為資料依據! 目的 來抓取空位數量 >15, 抓取空位數量 <15。…