導航:首頁 > 程序命令 > wpf命令事件

wpf命令事件

發布時間:2022-04-19 00:40:25

『壹』 如何將WPF中的命令綁定到控制項的雙擊事件處理程序

在視圖編輯的界面,右鍵控制項屬性,看到那個黃色的閃電圖標沒,點擊,裡面就是這個控制項可以相應的事件,然後你雙擊相應的事件,程序會為你自動生成函數頭部的

『貳』 WPF命令和事件之間的區別是什麼

一般來說,你可以做幾乎與事件與命令,它是處理用戶交互只是一個不同的模式。

命令在WPF讓您的命令處理程序的實現移動到樓內設有商務層。命令結合啟用狀態executation,所以一切都在發生。里德更多通過搜索MVVM模式。

命令更復雜的實施在第一,所以如果你的應用程序是小,你應該考慮的只是堅持到事件。

『叄』 什麼時候使用事件和命令為WPF / MVVM

利用View里的IsEnable屬性。 原理是這樣的: 1、UI中的IsEnabled綁定VM中的屬性 2、UI的後台代碼中,注冊IsEnableChange事件,在這個事件里,檢測到傳過來的值滿足某個條件,即可觸發Close()命令

『肆』 WPF的自定義控制項怎樣添加Click事件

首先要給控制項添加屬性,然後為其添加事件,最後添加命令,具體步驟如下:

1,為控制項添加屬性(依賴屬性,DependencyProperty)
正如下面的代碼所示:

=
DependencyProperty.Register("Time",typeof(DateTime),typeof(ClockUserCtrl),
newFrameworkPropertyMetadata(DateTime.Now,newPropertyChangedCallback(TimePropertyChangedCallback)));

我們為控制項(或者任何一個WPF類)添加的依賴屬性都是"公開的","靜態的","只讀的",其命名方式是"屬性名+Property",這是依賴屬性一成不變的書寫方式.對於依賴屬性的注冊可以在聲明該屬性時就調用DependencyProperty.Register()方法注冊,也可以在其靜態構造方法中注冊.上面的DependencyProperty.Register方法的幾個參數分別是:屬性名(該屬性名與聲明的依賴屬性名稱"XXXProperty"相比僅僅是少了"Property"後綴,其它完全一樣,否則在運行時會報異常),屬性的數據類型,屬性的擁有者的類型,元數據.
關於參數中傳遞的元數據:如果是普通的類則應該傳遞PropertyMetadata,如果是FrameworkElement則可以傳遞FrameworkPropertyMetadata,其中FrameworkPropertyMetadata中可以制定一些標記表明該屬性發生變化時控制項應該做出什麼反應,比如某屬性的變化會影響到該控制項的繪制,那麼就應該像這樣書寫該屬性的元數據:new
FrameworkPropertyMetadata(defauleValue,
.AffectsRender);這樣當該屬性發生變化時系統會考慮重繪該控制項.另外元數據中還保護很多內容,比如默認值,數據驗證,數據變化時的回調函數,是否參與屬性"繼承"等.
然後,我們將該依賴屬性包裝成普通屬性:


[Description("獲取或設置當前日期和時間")]
[Category("CommonProperties")]
publicDateTimeTime
{
get
{
return(DateTime)this.GetValue(TimeProperty);
}
set
{
this.SetValue(TimeProperty,value);
}
}

GetValue和SetValue方法來自於DependencyObject類,其用於獲取或設置類的某屬性值.
注意:在將依賴屬性包裝成普通屬性時,在get和set塊中除了按部就班的調用GetValue和SetValue方法外,不要進行任何其它的操作.下面的代碼是不恰當的:


[Description("獲取或設置當前日期和時間")]
[Category("CommonProperties")]
publicDateTimeTime
{
get
{
return(DateTime)this.GetValue(TimeProperty);
}
set
{
this.SetValue(TimeProperty,value);
this.OnTimeUpdated(value);//Error
}
}

在以前這或許是很多人的慣用寫法,但在WPF中,這樣的寫法存在潛在的錯誤,原因如下:我們知道繼承於DependencyObject的類擁有GetValue和SetValue方法來獲取或設置屬性值,那為什麼我們不直接使用該方法來獲取或設置屬性值,而要將其包裝成普通的.NET屬性呢,事實上在這里兩種方式都是可以的,只不過包裝成普通的.NET屬性更符合.NET開發人員的習慣,使用GetValue和SetValue更像JAVA開發人員的習慣,但XAML在執行時似乎於JAVA開發人員一樣,其不會調用.NET屬性而是直接使用GetValue或SetValue方法,這樣一來,我們寫在get塊和set塊中的其它代碼根本不會被XAML執行到.所以說,就上面的Time屬性而言,C#(或其它)對該屬性的調用不會出現任何問題,但該屬性被用在XAML中時(比如在XAML對該屬性進行數據綁定等),其set塊中的this.OnTimeUpdated(value);語句不會被執行到.
那麼,當Time屬性發生變化時的確需要調用this.OnTimeUpdated(value);語句(因為該語句會引發時間被更新了的事件),還是在傳遞的依賴屬性元數據做文章:
new FrameworkPropertyMetadata(DateTime.Now,new PropertyChangedCallback(TimePropertyChangedCallback)),我們為屬性的變化指定了一個回調函數,當該屬性變化時該回調函數就會被執行:


(DependencyObjectsender,)
{
if(sender!=null&&senderisClockUserCtrl)
{
ClockUserCtrlclock=senderasClockUserCtrl;
clock.OnTimeUpdated((DateTime)arg.OldValue,(DateTime)arg.NewValue);

}
}



2,為控制項添加事件(傳閱事件,RoutedEvent)
添加傳閱事件的方法與添加依賴屬性的方法很類似:


=
EventManager.RegisterRoutedEvent("TimeUpdated",
RoutingStrategy.Bubble,typeof(<DateTime>),typeof(ClockUserCtrl));


其支持方法EventManager.RegisterRoutedEvent()對應的幾個參數分別為:事件名稱,事件傳閱的方式(向上傳閱,向下傳閱或不傳閱),事件對應的EventHandler的類型,事件擁有者的類型)
然後將事件包裝成普通的.NET事件:


[Description("日期或時間被更新後發生")]
publicevent<DateTime>TimeUpdated
{
add
{
this.AddHandler(TimeUpdatedEvent,value);
}
remove
{
this.RemoveHandler(TimeUpdatedEvent,value);
}
}

注意,與依賴屬性一樣,不要在add與remove塊中添加除AddHandler與RemoveHandler以外的代碼.
題外話,事件參數中的e.Handled=true並不是終止事件的傳閱,這只是為事件做一個標記而已,以便在默認情況下的讓那些事件處理函數在該標記為true的情況下不被調用,要為該標記為true的事件注冊處理方法並讓該方法得到執行,請使用AddHandler方法,並把最後一個參數handlerEventsToo設置為true,如下:

this.myInkCanvas.AddHandler(
InkCanvas.MouseLeftButtonDownEvent,
newMouseButtonEventHandler(
myInkCanvas_MouseLeftButtonDown),
true);
privatevoidmyInkCanvas_MouseLeftButtonDown(
objectsender,MouseButtonEventArgse)
{
//dosomething
}


然後編寫慣用的OnXXX方法:


(DateTimeoldValue,DateTimenewValue)
{
<DateTime>arg=
new<DateTime>(oldValue,newValue,TimeUpdatedEvent);
this.RaiseEvent(arg);

}



3,為控制項添加命令(Commands)
能為自定義控制項添加如WPF內置控制項一樣的命令是一件很不錯的事情(事實上這也是在CustomControl中降低界面和後台邏輯耦合度的一種方法,本系列隨筆中的下一篇中將會具體談談).
WPF中內置的命令有兩大類型:RoutedCommand以及RoutedUICommand,後者比前者多了一個Text屬性用於在界面上自動本地化地顯示該命令對應的文本,更多的可以參考WPF中的命令與命令綁定(一)以及WPF中的命令與命令綁定(二).
這里我們來定義一個命令,其功能是控制項的語音報時.首先我們定義一個命令:


=newRoutedUICommand("Speak","Speak",typeof(ClockUserCtrl));

參數分別為命名的顯示名稱,命令的名稱,命令的擁有者類型.
然後在控制項的靜態函數中定義一個命令綁定,該命令綁定定義了命令的具體細節:對應的命令是什麼?其完成什麼樣的功能,當前環境下其能執行嗎?


CommandBindingcommandBinding=newCommandBinding(SpeakCommand,newExecutedRoutedEventHandler(ExecuteSpeak),
(CanExecuteSpeak));
privatestaticvoidExecuteSpeak(objectsender,ExecutedRoutedEventArgsarg)
{
ClockUserCtrlclock=senderasClockUserCtrl;
if(clock!=null)
{
clock.SpeakTheTime();
}
}
(objectsender,CanExecuteRoutedEventArgsarg)
{
ClockUserCtrlclock=senderasClockUserCtrl;
arg.CanExecute=(clock!=null);
}

CanExecuteRoutedEventArgs的CanExecute屬性用於指示當前命令是否可用,也就是說系統會不斷地檢視該命令與該命令的作用對象,並根據你所提供的條件來判斷當前命令是否可用,比如文本框狀態變為"只讀"後,其"粘貼"命令將不可用,作用於該文本框的粘貼按鈕會自動被禁用,反之則啟用.
new ExecutedRoutedEventHandler(ExecuteSpeak)委託指定了當該命令被執行時所要完成的任務,這通過回調ExcuteSpeak函數來實現.


privatestaticvoidExecuteSpeak(objectsender,ExecutedRoutedEventArgsarg)
{
ClockUserCtrlclock=senderasClockUserCtrl;
if(clock!=null)
{
clock.SpeakTheTime();
}
}
privatevoidSpeakTheTime()
{
DateTimelocalTime=this.Time.ToLocalTime();
stringtextToSpeak="現在時刻,"+localTime.ToShortDateString()+","+localTime.ToShortTimeString()+",星期"+(int)localTime.DayOfWeek;
this.speecher.SpeakAsync(textToSpeak);
}

我們也可以為命令添加快捷鍵,這是通過InputBinding來實現的,其將命令與命令的快捷鍵關聯起來,比如:

InputBindinginputBinding=newInputBinding(SpeakCommand,newMouseGesture(MouseAction.LeftClick));
CommandManager.RegisterClassInputBinding(typeof(ClockUserCtrl),inputBinding);

這樣,當我們滑鼠點擊控制項時就會引發控制項的Speak命令,從而調用SpeakTheTime函數進行語音播報.
快捷鍵可以通過MouseGesture或KeyGesture來定義.

『伍』 WPF怎麼調用按鈕觸發事件的方法

可以的,只是沒什麼意義

this.txtDelay_KeyDown(txtDelay,newKeyEventArgs(
System.Windows.Input.Keyboard.PrimaryDevice,
PresentationSource.CurrentSources.OfType<PresentationSource>().First(),
Environment.TickCount,
Key.A));

『陸』 VS菜鳥請教WPF編程中按鈕事件的問題:Click和Click_1

出現 XXX_Click_1 的原因:
在設計器上點擊按鈕自動生成了 XXX_Click 函數,因某個操作 (刪除控制項後再次添加) 導致 XAML 中 Click="XXX_Click" 代碼丟失,然後再次點擊按鈕而自動生成的。

解決辦法很簡單,在 XAML 代碼編輯器中找到 XXX 然後將 Click="XXX_Click_1" 改成 "XXX_Click" 就可以了。也就是說,可以先定義事件處理函數,然後再為一個或多個控制項指定。

RoutedEventArgs 和 EventArgs 不能隨意替換。

Route 的意思就是路由,在 WPF 中引入了事件路由這一概念,舉個例子比較好理解一點:

窗口中有一系列的控制項 Grid\StackPanel\Button 等,

在 WinForm 中:當 Button 的 MouseMove 事件被觸發時,其父級控制項 (StackPanel、Grid、Form) 是不會觸發 MouseMove 事件的。

WPF 中:會因路由概念的引入,導致 Button 的所有父級控制項觸發 MouseMove 事件,當然,前提是在代碼中指定了事件函數。

所以,我們需要 RoutedEventArgs 這個參數,從 e.Source、e.OriginalSource 來確定該事件是由哪個子控制項觸發的。由於 WPF 控制項是由 ControlTemplate 定義的,所以,單個控制項也會需要事件路由來確定,該控制項的模板中哪個元素引發了事件,從而精確處理控制項事件。

『柒』 wpf命令的好處,直接用方法不行嗎搞的跟dos一樣,感覺很奇特

wpf的命令用於那種需要主動詢問的情況。比如,用戶輸入賬戶密碼後登錄按鈕處於可用狀態。傳統的方式得用textChange事件來做。命令則不需要,命令讓textbox主動發送狀態來控制登錄按鈕的狀態。是一種狀態直接到狀態的方式。

說到底,WPF的命令給了你除了方法以外的多的一個選擇。

『捌』 wpf窗體添加事件的地方在哪裡

雙擊按鈕。
在代碼編輯器中,將隨即創建 Click 事件處理程序,並且游標放置在該事件處理程序中。
將以下代碼添加到事件處理程序中:C# code
MessageBox.Show("Event handler was created by " + "double-clicking the button.");
從「工具箱」中將第二個「Button」控制項拖到 WPF 設計圖面上,然後選擇該按鈕。
向 XAML 編輯器中的 Button 元素添加一個名為 Click 的屬性,並將屬性值設置為 ButtonOKClicked。此名稱便是要指定給代碼中的事件處理程序的名稱。例如,該屬性可以編寫為:Click="ButtonOKClicked"。
右擊設計器,然後單擊「查看代碼」。
向 Window1 類添加以下事件處理程序。單擊按鈕時,此代碼將顯示一條消息。
private void ButtonOKClicked(object sender, RoutedEventArgs e){MessageBox.Show("Event handler was created manually.");}
按 F5 運行程序。
當窗口出現時,單擊按鈕。
驗證在單擊每個按鈕時消息框中顯示的文本是否正確,然後關閉該應用程序。

『玖』 WPF中的事件及冒泡事件和隧道事件的區別

冒泡事件表示事件從元素樹向上到達根元素。這樣您就可以在源元素的上方層級對象處理事件。例如,您可向嵌入的 Grid 元素附加一個 Button.Click 處理程序,而不是直接將其附加到按鈕本身。氣泡事件有指示其操作的名稱(例如,MouseDown)。
隧道事件表示事件從根元素開始向下遍歷元素樹。這樣上游元素就可以在事件到達源元素之前先行截取並進行處理。根據命名慣例,隧道事件帶有前綴 Preview(例如 PreviewMouseDown)。

『拾』 WPF DataGridTextColumn 怎麼綁定一個事件命令

如果要實現類似點擊header裡面checkbox全選或反選的話,你要用DataGridTemplateColumn,然後在模板里設置UIElement,然後綁定Command或Event
如果要實現點擊header排序的話,就需要設置CanUserSort="True"和SortMemberPath

閱讀全文

與wpf命令事件相關的資料

熱點內容
噴油螺桿製冷壓縮機 瀏覽:577
python員工信息登記表 瀏覽:375
高中美術pdf 瀏覽:158
java實現排列 瀏覽:511
javavector的用法 瀏覽:979
osi實現加密的三層 瀏覽:230
大眾寶來原廠中控如何安裝app 瀏覽:911
linux內核根文件系統 瀏覽:240
3d的命令面板不見了 瀏覽:521
武漢理工大學伺服器ip地址 瀏覽:144
亞馬遜雲伺服器登錄 瀏覽:521
安卓手機如何進行文件處理 瀏覽:70
mysql執行系統命令 瀏覽:926
php支持curlhttps 瀏覽:142
新預演算法責任 瀏覽:443
伺服器如何處理5萬人同時在線 瀏覽:247
哈夫曼編碼數據壓縮 瀏覽:424
鎖定伺服器是什麼意思 瀏覽:383
場景檢測演算法 瀏覽:616
解壓手機軟體觸屏 瀏覽:348