C# WPF后台动态添加控件实战教程

目录
  • 概述
  • ​项目介绍
  • 代码设计
  • 源码
  • 总结

概述

在Winform中从后台添加控件相对比较容易,但是在WPF中,我们知道界面是通过XAML编写的,如何把后台写好的控件动态添加到前台呢?本节举例介绍这个问题。

这里要用到UniformGrid布局,UniformGrid 是一种横向的网格分割、纵向的网格分割分别是均等的分割的布局类型.

​项目介绍

-. 这里界面添加一个ComboBox用来下拉选择图片数量;

-. 添加一个button用来执行图片显示;

dispaly下方是图片显示区域

代码设计

-.前台XAML代码:

<Grid>
        <dxlc:LayoutControl Orientation="Vertical">
            <dxlc:LayoutGroup Orientation="Horizontal" View="GroupBox">
                <dxlc:LayoutGroup.Header>
                    <dxlc:LayoutItem Label="Action" Background="#FF004486" Foreground="White"/>
                </dxlc:LayoutGroup.Header>
                <dxlc:LayoutItem Label="Image Count" >
                    <ComboBox SelectedIndex="{Binding ComSelectedIndex}">
                        <ComboBoxItem>2</ComboBoxItem>
                        <ComboBoxItem>4</ComboBoxItem>
                        <ComboBoxItem>6</ComboBoxItem>
                    </ComboBox>
                </dxlc:LayoutItem>
                <dxlc:LayoutItem Width="110">
                    <dx:SimpleButton Content="Image Dispaly" Background="LightGray"
                       cal:Message.Attach="[Event Click]=[btnAdd_Click($source,$eventArgs)]" />
                </dxlc:LayoutItem>
            </dxlc:LayoutGroup>

            <dxlc:LayoutGroup Orientation="Horizontal" View="GroupBox">
                <dxlc:LayoutGroup.Header>
                    <dxlc:LayoutItem Label="Dispaly" Background="#FF004486" Foreground="White"/>
                </dxlc:LayoutGroup.Header>
                <UniformGrid
                        cal:Message.Attach="[Event Loaded]=[UniformGrid_Loaded($source,$eventArgs)]" />
            </dxlc:LayoutGroup>
        </dxlc:LayoutControl>
    </Grid>

前台代码比较简单,只要关注下UniformGrid控件,绑定了Loaded事件。

-.后台代码:

[AddINotifyPropertyChangedInterface]
   public class UniformGridViewModel : Screen, IViewModel
   {
       public int ComSelectedIndex { get; set; }

       public UniformGrid UniformGrid;

       public string[] ImageFullPath;
       public void btnAdd_Click(object sender, RoutedEventArgs e)
       {
           UniformGrid.Children.Clear();
           UniformGrid.Columns = 2;

           var count = 0;
           switch(ComSelectedIndex)
           {
               case 0:
                   count = 2;break;
               case 1:
                   count = 4; break;
               case 2:
                   count = 6; break;
               default: break;
           }
           for (int i = 0; i < count; i++)
           {
               Image image = new Image();
               image.Source = LoadImageFreeze(ImageFullPath[i]);
               image.MouseLeftButtonUp += ImageClick;
               image.Name = Path.GetFileNameWithoutExtension(ImageFullPath[i]);
               image.Margin = new Thickness(5);
               UniformGrid.Children.Add(image);
           }
       }

       public void ImageClick(object sender, MouseButtonEventArgs e)
       {
           var name = (sender as Image).Name;
           MessageBox.Show($"当前选择的图片名称:{name}");
       }
       public void UniformGrid_Loaded(object sender, RoutedEventArgs e)
       {
           UniformGrid = (UniformGrid)sender;
       }
       public UniformGridViewModel()
       {
           DisplayName = "UniformGrid";
           string imagePath =Path.Combine( AppDomain.CurrentDomain.BaseDirectory, "Images");
           ImageFullPath = Directory.GetFiles(imagePath, "*.png");
       }

       public static BitmapImage LoadImageFreeze(string imagePath)
       {
           try
           {
               var bitmap = new BitmapImage();
               if (File.Exists(imagePath))
               {
                   bitmap.BeginInit();
                   bitmap.CacheOption = BitmapCacheOption.OnLoad;

                   using (Stream ms = new MemoryStream(File.ReadAllBytes(imagePath)))
                   {
                       bitmap.StreamSource = ms;
                       bitmap.EndInit();
                       bitmap.Freeze();
                   }
               }
               return bitmap;
           }
           catch (Exception)
           {
               return null;
           }
       }
   }

介绍:

①LoadImageFreeze:从路径下加载图片并转换为BitmapImage;

②UniformGrid_Loaded;获取UniformGrid对象;

③ImageFullPath:从项目bin下获取图片文件并读取到这个数组;

④btnAdd_Click:界面button点击事件,这里是核心的代码,主要就是申城图片,然后设定好 UniformGrid的行列以及其他属性后添加到控件里面, UniformGrid.Children.Add(image);

⑤ImageClick:点击后显示图片的名称.

源码

点击这里下载

总结

到此这篇关于C# WPF后台动态添加控件的文章就介绍到这了,更多相关C# WPF后台动态加控件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 在WPF中动态加载XAML中的控件实例代码

    本文实例讲述了在WPF中动态加载XAML中的控件的方法.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using S

  • Angularjs 实现动态添加控件功能

    实现下面这样的需求: 点击增加一块数据盘,会出现数据盘选项. (1)最开始,想到原生JavaScript,jQuery (appendChild()等方法结合AngularJS来添加新的元素.但是突然发现控件里面的数据绑定,原生javascript没法控制. (2)上网查资料,找到$compile服务,动态改变html内容.本以为这可以解决我的需求,但是仔细研究发现$compile是这样的东西. 用$compile服务创建一个directive 'compile',这个complie会将传入的h

  • ASP.NET动态添加控件一例

    第一次单击页面中有3个Label,第二次单击有6个,第三次单击有9个,也就是每次单击要在上次的状态下再添加3个. 我的方法是,可以通过Session来保存上次的状态,一种解法如下: Test.aspx关键代码: 复制代码 代码如下: <form id="form1" runat="server"> <asp:DropDownList ID="DropDownList1" runat="server">

  • 基于Jquery的动态添加控件并取值的实现代码

    复制代码 代码如下: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Jquery动态控件</title> <script src="jquery-1.4.2.js" type="text/javascript"></script> <script ty

  • 动态向页面添加控件和使用正则表达式的代码

    复制代码 代码如下: namespace WebCode { public partial class _default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { String str = "这是一个测试文件<{config name=\"pagetitle1\"}>,一个标签的解析<{config name=\"pagetitle2\

  • WPF自定义选择年月控件详解

    本文实例为大家分享了WPF自定义选择年月控件的具体代码,供大家参考,具体内容如下 封装了一个选择年月的控件,XAML代码: <UserControl x:Class="SunCreate.CombatPlatform.Client.DateMonthPicker" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.micr

  • 用javascript添加控件自定义属性解析

    前面说过为HTML元素添加自定义的属性,是通过手动在HTML控件中加上,其实可以在javascript中动态添加:如有一文本框: 复制代码 代码如下: <input type="text" id="txtInput" name="txtInput" value="自定义文本"> 如想增加idvalue属性(值为"自定义值"),可以在javascript中这样写: 复制代码 代码如下: var t

  • MFC中动态创建控件以及事件响应实现方法

    本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示. 静态控件不需要调用Create()

  • Android学习教程之动态GridView控件使用(6)

    本文实例为大家分享了Android动态GridView控件使用的具体代码,供大家参考,具体内容如下 MainActivity.java代码: package siso.haha; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button

  • C#动态代码生成控件后其他事件不能获取该控件值的解决方法

    前言 本文主要给大家介绍了关于C#动态代码生成控件后其他事件不能获取该控件值的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 1.新建web项目,添加两个Button控件,结果如图. 2.Button按钮控件点击事件代码如下 protectedvoid Button1_Click(object sender, EventArgs e) { TextBox t = newTextBox(); t.ID = "test"; t.Text = "测试框&q

  • C# wpf Canvas中实现控件拖动调整大小的示例

    目录 前言 一.功能说明 二.如何实现? 1.继承Adorner 2.使用Thumb 3.实现拖动逻辑 三.完整代码 四.使用示例 总结 前言 我们做图片编辑工具.视频编辑工具.或者画板有时需要实现控件缩放功能,比如图片或图形可以拉伸放大或缩小,实现这种功能通常需要8个点,对应4条边和4个角,在wpf中通常可以使用装饰器实现. 一.功能说明 8个点方放置在控件的8个方位上,通过拖动这些点对控件进行拉伸或缩小,示意图如下: 二.如何实现? 1.继承Adorner 通过装饰器的方式添加8个点在控件上

随机推荐