Ⅰ wpf中怎麼為label添加單擊事件
Label_MouseDown
Ⅱ 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中能否實現,在點擊button按鈕後,點擊後事件為生成一張圖片。
何為「生成一張圖片」。如果你的意思是尋找到項目某路徑下的圖片並在前台顯示,這個是可以做到的。當然,圖片路徑可以在後台寫死,也可以綁定到button的某個屬性(如Tag),動態的去遍歷尋找圖片也是可行的!~
Ⅳ WPF 怎麼在chart裡面加一個按鈕,可以添加點擊事件。如圖
不用添加按鈕就可以生成點擊事件啊。
Ⅳ wpf或HTML5里插入圖片,在圖片上做標記,點擊標記觸發事件
WPF用RenderTransform實現,隨便做了個,代碼如下。
XAML
<Windowx:Class="WpfApplication3.MainWindow"
xmlns="
xmlns:x="
Title="MainWindow"
Height="350"
Width="525">
<Grid>
<ImageName="image"Source="/WpfApplication3;component/Images/Hydrangeas.jpg">
<Image.RenderTransform>
<TransformGroup>
<RotateTransformx:Name="rt"/>
<ScaleTransformx:Name="st"/>
<TranslateTransformx:Name="tt"/>
</TransformGroup>
</Image.RenderTransform>
</Image>
<StackPanelOrientation="Horizontal"
Height="20">
<ButtonName="btnScale1"
Content="縮小"
Click="btnScale1_Click"/>
<ButtonName="btnScale2"
Content="放大"
Click="btnScale2_Click"/>
<ButtonName="btnRotation1"
Content="左轉"
Click="btnRotation1_Click"/>
<ButtonName="btnRotation2"
Content="右轉"
Click="btnRotation2_Click"/>
<ButtonName="btnMove1"
Content="左移"
Click="btnMove1_Click"/>
<ButtonName="btnMove2"
Content="右移"
Click="btnMove2_Click"/>
<ButtonName="btnMove3"
Content="上移"
Click="btnMove3_Click"/>
<ButtonName="btnMove4"
Content="下移"
Click="btnMove4_Click"/>
</StackPanel>
</Grid>
</Window>
CS如下
namespaceWpfApplication3
{
///<summary>
///MainWindow.xaml的交互邏輯
///</summary>
publicpartialclassMainWindow:Window
{
publicMainWindow()
{
InitializeComponent();
DataContext=this;
}
privatebool_ischecked=false;
publicboolIsChecked
{
get
{
return_ischecked;
}
}
privatevoidbtnScale1_Click(objectsender,RoutedEventArgse)
{
st.CenterX=image.ActualWidth/2;
st.CenterY=image.ActualHeight/2;
st.ScaleX-=0.1;
st.ScaleY-=0.1;
}
privatevoidbtnScale2_Click(objectsender,RoutedEventArgse)
{
st.CenterX=image.ActualWidth/2;
st.CenterY=image.ActualHeight/2;
st.ScaleX+=0.1;
st.ScaleY+=0.1;
}
privatevoidbtnRotation1_Click(objectsender,RoutedEventArgse)
{
rt.CenterX=image.ActualWidth/2;
rt.CenterY=image.ActualHeight/2;
rt.Angle-=10;
}
privatevoidbtnRotation2_Click(objectsender,RoutedEventArgse)
{
rt.CenterX=image.ActualWidth/2;
rt.CenterY=image.ActualHeight/2;
rt.Angle+=10;
}
privatevoidbtnMove1_Click(objectsender,RoutedEventArgse)
{
tt.X-=10;
}
privatevoidbtnMove2_Click(objectsender,RoutedEventArgse)
{
tt.X+=10;
}
privatevoidbtnMove3_Click(objectsender,RoutedEventArgse)
{
tt.Y-=10;
}
privatevoidbtnMove4_Click(objectsender,RoutedEventArgse)
{
tt.Y+=10;
}
}
}
Ⅵ 如何:為 WPF 控制項創建事件處理程序
通過雙擊「設計」視圖中的控制項,可以為許多控制項添加默認事件處理程序。此外,也可以通過向控制項的 XAML 表示形式添加屬性為 Windows Presentation Foundation (WPF) 應用程序中的控制項創建事件處理程序。此 XAML 標記定義事件以及要處理該事件的方法的名稱。然後,在代碼編輯器中編寫方法的代碼。
Ⅶ WPF C# 如何在動態添加的grid控制項中添加某個網格的單擊事件
你在網格中放圖片用的是什麼控制項?Image嗎,那為何不直接用Image控制項的點擊事件,你可以去掉Image的水平和垂直對齊屬性讓Image充滿整個單元格,然後添加Image控制項的MouseDown/Up事件(Image好像沒有Click事件),這樣點擊哪個Image,你就更換這個Image的Source不就行了
如果要定位具體是哪個單元格,那可以
void ImageMouseDown(object sender, MouseButtonEventArgs e)
{
if (sender is Image)
{
Image image = sender as Image;
// 以下是Image控制項所處Grid的行和列
int RowIndex = Grid.GetRow(image);
int ColumnIndex = Grid.GetColumn(image);
// 也可以在這里更換圖片
image.Source = ....
}
}