如何在C#中使用Image控件
这篇文章给大家介绍如何在C#中使用Image控件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
首先是View层,比较简单:
<GridGrid.Row="1"> <ImageSource="{BindingPath=LTEModel.ImgSource,Converter={StaticResourceMyImageConverter}}"Stretch="Fill"> </Image> </Grid>
然后我们再来看看Model层也很简单。
publicclassLTEModel:BaseModel { privatestring_imageSource=null; publicstringImgSource { get { return_imageSource; } set { if(value!=_imageSource) { _imageSource=value; FirePropertyChanged("ImgSource"); } } } }
然后就是重要的转换器:
publicclassStringToImageSourceConverter:IValueConverter { #regionConverter publicobjectConvert(objectvalue,TypetargetType,objectparameter,CultureInfoculture) { stringpath=(string)value; if(!string.IsNullOrEmpty(path)) { returnnewBitmapImage(newUri(path,UriKind.Absolute)); } else { returnnull; } } publicobjectConvertBack(objectvalue,TypetargetType,objectparameter,CultureInfoculture) { returnnull; } #endregion }
然后就是重要的转换器:
publicclassStringToImageSourceConverter:IValueConverter { #regionConverter publicobjectConvert(objectvalue,TypetargetType,objectparameter,CultureInfoculture) { stringpath=(string)value; if(!string.IsNullOrEmpty(path)) { returnnewBitmapImage(newUri(path,UriKind.Absolute)); } else { returnnull; } } publicobjectConvertBack(objectvalue,TypetargetType,objectparameter,CultureInfoculture) { returnnull; } #endregion }
转换器返回的是Object类型,实际返回的是一个BitmapImage对象。所以我们在写程序绑定的时候一定要弄清绑定的目标和对象之间的关系,这个是非常重要的。
下面就是在ViewModel层中来添加绑定,并更新数据源,这里使用的是一个定时器来定时更新数据源:
publicclassLTEViewModel:NotifyObject { privateDispatcherTimermyDispatcher=null; privateRandomrandom=newRandom(); publicLTEViewModel() { GetImageSource(); InitTimer(); } privateLTEModel_lteModel=null; publicLTEModelLTEModel { get { if(_lteModel==null) { _lteModel=newLTEModel(); } return_lteModel; } set { if(value!=_lteModel) { _lteModel=value; FirePropertyChanged("LTEModel"); } } } privateBaseModel_baseModel=null; publicBaseModelBaseModelInstance { get { if(_baseModel==null) { _baseModel=newBaseModel() { Title="分地区LTE分布", Time=DateTime.Now.ToString() }; } return_baseModel; } set { if(value!=_baseModel) { _baseModel=value; FirePropertyChanged("BaseModelInstance"); } } } privateList<string>imgList=newList<string>(); privatevoidGetImageSource() { //通过程序集来读取相应的资源的路径 stringassemblyLocation=this.GetType().Assembly.Location; stringassLocation=assemblyLocation.Substring(0,assemblyLocation.LastIndexOf("\\")); string[]img_files=Directory.GetFiles(string.Format("{0}\\Images",assLocation),"*.JPG"); foreach(stringimg_pathinimg_files) { imgList.Add(img_path); } } privatevoidInitTimer() { myDispatcher=newDispatcherTimer(); myDispatcher.Tick+=newEventHandler(Timer_Tick); myDispatcher.Interval=TimeSpan.FromMilliseconds(1000); myDispatcher.Start(); } privatevoidTimer_Tick(objectsender,EventArgse) { intimageIndex=0; if(imgList.Count>0&<EModel!=null) { imageIndex=random.Next(0,imgList.Count); LTEModel.ImgSource=imgList[imageIndex]; } if(_baseModel!=null) { _baseModel.Time=DateTime.Now.ToString(); } } }
然后就是实例化一个ViewModel对象绑定到前台中,这个思路其实是相当明确的。
其实在我们的很多时候,我们并不知道我们需要绑定什么图片,或者说根据数据类型来绑定图片,这个在定义数据模板的时候经常使用到,下面就介绍一下,根据类型来绑定相应的图片。然后通过定义
publicenumDeviceType { SheXiangJi, KaKou, DianZiJingCha, MingJin }
这种类型,通过不同的类型来绑定到不同的图片,这个也是一个非常重要的应用,我们一定要注意使用的方法,这里只是简单介绍一下。
<ItemsControlItemsSource="{BindingDeviceList,RelativeSource={RelativeSourceTemplatedParent}}"Grid.Row="2"> <ItemsControl.Template> <ControlTemplateTargetType="ItemsControl"> <UniformGridColumns="3"Rows="7"IsItemsHost="True"></UniformGrid> </ControlTemplate> </ItemsControl.Template> <ItemsControl.ItemTemplate> <DataTemplate> <StackPanelOrientation="Horizontal"HorizontalAlignment="Left"Margin="20000"VerticalAlignment="Center"SnapsToDevicePixels="True"> <Imagex:Name="icon1"Width="48"Height="48"RenderOptions.BitmapScalingMode="NearestNeighbor"VerticalAlignment="Center"></Image> <TextBlockMargin="10000"Foreground="#fff"ToolTip="{BindingName}"FontSize="40"Text="{BindingName}"HorizontalAlignment="Left"VerticalAlignment="Center"></TextBlock> </StackPanel> <DataTemplate.Triggers> <DataTriggerBinding="{BindingType}"Value="SheXiangJi"> <SetterProperty="Source"Value="/IGisControls.JTJ.UIControls;component/images/camera.png"TargetName="icon1"></Setter> </DataTrigger> <DataTriggerBinding="{BindingType}"Value="KaKou"> <SetterProperty="Source"Value="/IGisControls.JTJ.UIControls;component/images/Bayonet.png"TargetName="icon1"></Setter> </DataTrigger> <DataTriggerBinding="{BindingType}"Value="DianZiJingCha"> <SetterProperty="Source"Value="/IGisControls.JTJ.UIControls;component/images/epolice.png"TargetName="icon1"></Setter> </DataTrigger> <DataTriggerBinding="{BindingType}"Value="MingJin"> <SetterProperty="Source"Value="/IGisControls.JTJ.UIControls;component/images/Police_A.png"TargetName="icon1"></Setter> </DataTrigger> </DataTemplate.Triggers> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl>
另外和Image很类似的就是<ImageBrush ImageSource="/IGisControls.JTJ.UIControls;component/images/screenBG.jpg" Stretch="Fill"></ImageBrush>
用法也差不多,同样可以通过绑定的方式来添加图片,不过在使用的时候还是需要注意一下就是设置当前图片的生成操作为Resource。
关于如何在C#中使用Image控件就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
推荐阅读
-
微软在游戏中断后在Windows 11上为谷歌Chrome撤下必应广告
-
一百年!WordPress 以 38,000 美元出售域名和托管计划
-
谷歌湾景园新总部即将上线
-
GPT-3.5 Turbo 现在可支持微调以提高质量和性能
OpenAI已向开发者提供了GPT-3.5Turbo(https://openai.com/blog/gpt-3-5-tur...
-
提高 Snowflake 工作效率的六大工具
-
值得收藏!如何快速画出一幅漂亮的架构图
阿里妹导读这篇文章总结了常用的架构图类型,可以借鉴笔者提供的模板,快速地产出符合业务需要的架构图。为什么要画好一幅架构图?一幅漂亮...
-
祝 Linux 32 岁生日快乐!🎂
-
Google 对十年不变的 Keep 笔记本应用添加功能
-
日本福岛含氚废水排放与争议
日本东京电力公司在24日午间将福岛第一核电站的核处理水(也称ALPS处理水)排放入海,中国全面暂停日本水产品进口。那么什么...
-
Code Llama,一个开源人工智能编码工具