跳到主要內容

發表文章

目前顯示的是有「WPF」標籤的文章

UWP 基礎頁面切換

前言 使用一個簡單的範例介紹如何切換頁面, 基本上會用到Frame的Navigate()作為頁面切換的方法, 以及實作OnNavigatedTo 處理頁面切換時的動作 假設今天我們要設計一支程式, 在主頁面(MainPage)上顯示顧客(Person)資料, 並且提供按鈕(Edit), 讓使用者按下去之後, 切換主頁面到編輯頁面(EditPage)修改資料, 使用情境如下: 情境一:使用者在主頁(MainPage)點擊Edit按鈕 情境二:使用者在編輯頁(EditPage)點擊Save按鈕 Data Model 我們首先建立一個Person的類別來表示顧客資訊 MainPage Code-Behind 我們在這邊宣告Person, 用來作UI元件的 Data Binding的目標物件 將DataContext 設為 this (作為UI元件的Data Binding的來源) 實作Edit按鈕的Click Event handler, 在這個函式內我們從Window.Current.Content取得 root frame 的實體, 然後呼叫它的 Navigate 方法去切換頁面並且把現在的Person資訊傳給EditPage 複寫(override) OnNavigatedTo 處理當頁面被切換回MainPage時, 我們要去更新Person MainPage.xaml 我們在這邊建立兩個TextBlock並且綁定Code-behind裡的Person.Name, 和Person.Id EditPage Code-Behind 這邊做的事情其實跟MainPage差不多, 宣告Person, 設定DataContext 複寫OnNavigatedTo, 拿MainPage傳過來的Person更新EditPage現在的 實作按鈕Click Event handler處理頁面切換的動作並傳遞更新後的Person給MainPage EditPage.xaml 在這個頁面供TextBox顯示MainPage傳過來的Person資訊, 以及提供按鈕Save去切換頁面, 然後將更新後的Person回傳給MainPage

[WPF]如何在程式中加入Hot key event

假設今天我想要讓使用者Hot key(如Alt) trigger程式做事情的時候 我們可以編寫UI的xaml 加入   PreviewKeyDown  事件的handler 並實作他 Step 1. Add event handler < Window         xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"         xmlns : x ="http://schemas.microsoft.com/winfx/2006/xaml"         xmlns : d ="http://schemas.microsoft.com/expression/blend/2008"         xmlns : mc ="http://schemas.openxmlformats.org/markup-compatibility/2006" mc : Ignorable ="d"         xmlns : conv ="clr-namespace:Solution.Converter"         x : Class ="Solution.MainWindow"          WindowState ="Maximized" WindowStyle ="None"         SnapsToDevicePixels ="True"         d : D...

[WPF] UI can't drag or move

由於 Window 設定  WindowStyle ="None" 因此會使UI變成不能拖拉的狀況 解決方法是註冊 MouseDown 的event handle 如下: < Window x : Class ="APPUI.MainWindow"         xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"         xmlns : x ="http://schemas.microsoft.com/winfx/2006/xaml"              Title ="MainWindow" Height ="540" Width ="764" ResizeMode ="NoResize"         WindowStyle ="None"         MouseDown ="Window_MouseDown_1"         > ... 並且實作  Window_MouseDown_1 private void Window_MouseDown_1( object sender, MouseButtonEventArgs e)         {             if (e.ChangedButton == MouseButton .Left) ...

[WPF] 如何在程式UI秀出來之前先作一些事情

如何在程式UI秀出來之前先作一些事情 首先我們必須知道 App.xaml 可以用來決定程式的起始點(starting point) 如下: <Application   x:Class = "WpfTutorialSamples.App"               xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"               xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"                StartupUri = "MainWindow.xaml" > 預設 StartupUri="MainWindow.xaml" 因此程式一開始會直接秀出 MainWindow 但是有時候我們會想在MainWindow出來前先做一些事情 此時我們就必須選用Startup的屬性來開始程式 並註冊Startup event 的event handle 讓程式起來的時候會先處理我們指定的事情 如下: Step 1. 實作Startup event的event handle   public   partial   class   App   :   Application           {                   private   void   Application_Startup ( object  sender ,   StartupEventArgs  e )      ...

[C#] 使用BackgroudWorker 取得執行結果

當我們的程式在處理極為耗時的運算時,為了不要讓UI停在那邊等待運算結果 可以使用thread , BackgroundWorker 來分擔UI thread 的工作量 一般來說首先需要註冊DoWork事件的event handle ...        _BackgroundWorker.DoWork += backgroundWorker_StartToWork; ...         private void backgroundWorker_StartToWork( object sender, DoWorkEventArgs e){             //statement        } 但若想要輸出執行結果的話 可以在DoWork事件的 event handle 裡( backgroundWorker_StartToWork )更新 e.Result的值,並註冊  RunWorkerCompleted  事件的 envent handle, 再藉由它 取得 e.Result          private void backgroundWorker_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e)        {              //statement        }

[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 = new BitmapImage ( new Uri ( "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. Thread thread = new System.Threading. Thread (() => GenerateDataAndUpdateUI( this )); thread.Start(); 可是在update UI control 時 必須使用 Dispatcher 物件來通知 UI thread 去做更新   GenerateDataAndUpdateUI(){                               //generate data ...                  Dispatcher.BeginInvoke( new Action (() => {                                                          //update UI ...                 })); } 否則可能會遇到以下的runtime exception The calling thread cannot access this object because a...

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

以 DoubleAnimation 的動畫特效來實現: 當游標經過目標圖片時自動放大圖片的功能 以下面簡單的UI當作範例 < Window   x   : 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   >           < Image   Name   ="IconImage"   Source ="icon.jpg"   HorizontalAlignment ="Left"   Height ="100"   Margin ="180,118,0,0"   VerticalAlignment ="Top"   Width   ="100">         </ Window > 實作方法: 一.  首先建立 DoubleAnimation 和 Storyboard 若要將動畫套用在物件上, 須建立  Storyboard,...