导航:首页 > 图片大全 > wpf图片如何建立点击事件

wpf图片如何建立点击事件

发布时间:2022-08-10 15:07:50

Ⅰ 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 = ....
}
}

阅读全文

与wpf图片如何建立点击事件相关的资料

热点内容
男生图片唯美高清背景图 浏览:313
c如何读取图片 浏览:362
瓷器底款图片及价格 浏览:183
三只小可爱跳舞图片 浏览:503
图片动漫男孩 浏览:810
我的世界物品图片如何保存 浏览:603
可爱农村三宝图片 浏览:838
最新高清图片带字 浏览:542
幼儿园进区规则牌图片高清 浏览:564
少女情怀男生图片 浏览:531
ps如何改变布料图片颜色 浏览:588
女生穿内内图片 浏览:908
谢俞贺朝手写纯文字图片 浏览:782
狠劲的男生图片 浏览:147
女生穿裙裤搭配图片 浏览:119
适合图案圆形图片简单 浏览:130
最霸道的男生图片 浏览:414
怎么做带图片的表格 浏览:499
拟人卡通可爱图片 浏览:86
不知如何爱你的图片 浏览:463