跳到主要內容

發表文章

目前顯示的是 四月, 2016的文章

[WPF][Error] Must create DependencySource on same Thread as the DependencyObject

今天使用程式產生了一張BitmapImage的圖片
當要將圖片assign 給Form 的成員變數時卻遇到下面的錯誤訊息


Exception:
Must create DependencySource on same Thread as the DependencyObject.

由於圖片是透過worker thread 產生的, 上網爬文後才知道這麼做其實很危險 最保險的方法還是從resource   裡把圖片load 進來

另一個解法: BitmapImage 有一個 function  Freezable() ,我們可以藉由呼叫它將圖片變成 read-only 的狀態,  一旦圖片的屬性是read-only , 就可以放心的在其他執行緒中使用了

[WPF]為什麼無法在WINPE裡顯示圖片

當我們使用WPF的image cotrol來顯示圖片時
  LoadingImage.Source =newBitmapImage(newUri("H:\\Images\\img_loading_"+ count.ToString() +".png"));
如果要將程式跑在WINPE 下
WINPE環境裡必須有以下兩隻DLL - mscms.dll  - windowscodecsExt.dll
若缺少的話, 程式在執行期間拋出以下的錯誤訊息  unable to load DLL mscms.dll  unable to load DLL windowscodecsExt.dll

如何透過非 UI thread 去存取WPF control

如果把產生資料的邏輯交給UI thread去處理 則有可能會因為處理的資料量太大造成UI hang on的問題 因此我們可以創建另一個thread去幫我們做這件事情
System.Threading.Threadthread =newSystem.Threading.Thread(() => GenerateDataAndUpdateUI(this)); thread.Start();
可是在update UI control 時 必須使用 Dispatcher 物件來通知 UI thread 去做更新
GenerateDataAndUpdateUI(){ //generate data ...
 Dispatcher.BeginInvoke(newAction(() => {            //update UI ...                 }));
}
否則可能會遇到以下的runtime exception

The calling thread cannot access this object because a different thread owns it

WPF當游標經過目標圖片時自動放大圖片的功能

以 DoubleAnimation 的動畫特效來實現: 當游標經過目標圖片時自動放大圖片的功能 以下面簡單的UI當作範例
<Windowx:Class="MouseoverAndScaleUIImage.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow"Height="350"Width="525"> <Grid> <ImageName="IconImage"Source="icon.jpg"HorizontalAlignment="Left"Height="100"Margin="180,118,0,0"VerticalAlignment="Top"Width="100"> </Window>

實作方法:
一.  首先建立 DoubleAnimation 和 Storyboard 若要將動畫套用在物件上, 須建立 Storyboard,  並使用 TargetName 和 TargetProperty 附加屬性指定要建立動畫的物件和屬性
這邊的動畫效果是指定Height\Width來調整動畫的長寬 Storyboard.TargetProperty