当前位置: 首页 > news >正文

Wpf 使用 Prism 实战开发Day05

首页设计

1.效果图

一.代码现实

  • 根据页面布局,可以将页面设计成3行,每行中分多少列,看需求而定
  • 根据页面内容,设计Model 实体类,以及View Model

 1.Index.xaml 页面布局设计

  •  RowDefinition 分行(Row)属性,分几行就写几个
  • ColumnDefinition 分列(Column )属性,分几列就写几个
  •  Height 属性,Row (行)属性只有Height (高度),没有宽度。并且Height 设置成 auto 时,根据内容适应高度。
  • Width 属性,Column (列) 只有Width (宽度),没有Height (高度
  • Grid.Row 属性,将控件放置在第几行
  • Grid.Column 属性,将控件放置在第几列
  • FontWeight 属性,设置成 Bold (加粗)
  • Opacity 属性,透明度
  • ItemsSource 属性,数据源绑定
  • ClipToBounds 裁剪属性,在Canvas 控件中使用,ClipToBounds 设置成True后,超出的内容会被裁剪掉

  • 第一行设计,放置显示的文本控件 TextBlock。

FontSize 属性,控件显示的字体大小


  • 第二行设计,使用 ItemsControl 控件,并且固定4列。

  1. 在的Grid 控件中,每定义的每行(Row)中还可以划分成更细的行和列。根据需求自由灵活定义使用。
  2. ItemsControl 控件:它允许您将任何类型的数据绑定到其中,并为每个数据项显示一个模板

 ItemsControl 控件固定的写法。比如,要分4列

<ItemsControl><ItemsControl.ItemsPanel><ItemsPanelTemplate><UniformGrid Columns="4"/></ItemsPanelTemplate></ItemsControl.ItemsPanel>
</ItemsControl>

ItemsControl  列固定完后,接着进行固定内容模板的设计。内容设计固定的写法

<!--模板内容设计-->
<ItemsControl.ItemTemplate><DataTemplate></DataTemplate>
</ItemsControl.ItemTemplate>
  1. 进行模板内容设计的时候,首先要清楚模板中都要有那些内容
  2. 例如,当前的模板:有图标,标题文本,内容,背景颜色,还有2个白色的图标


  1.  外层使用Border ,要设计圆角
  2. Border 里面放置Grid,方便设计。因为Grid 中可以放置多个控件
  3. 右边白色的圆图标,使用Canvas 控件
<ItemsControl Grid.Row="1"><ItemsControl.ItemsPanel><ItemsPanelTemplate><UniformGrid Columns="4"/></ItemsPanelTemplate></ItemsControl.ItemsPanel><!--模板内容设计--><ItemsControl.ItemTemplate><DataTemplate><Border><Grid><StackPanel><!--图标--><materialDesign:PackIcon  Kind="Abacus" /><!--标题文本--><TextBlock Text="jj"/><!--内容--><TextBlock Text="888" FontWeight="Bold"/></StackPanel><!--白色背景底色控件--><Canvas><Border Canvas.Top="10" Canvas.Right="-50" Width="120" Height="120" Background="#ffffff" Opacity="0.1"/><Border Canvas.Top="80" Canvas.Right="-30" Width="120" Height="120" Background="#ffffff" Opacity="0.1"/></Canvas></Grid></Border></DataTemplate></ItemsControl.ItemTemplate>
</ItemsControl>
 1.1 模板设计完成后,进行数据内容动态渲染。
  • 创建首页内容数据集合实体类模型 TaskBar
/// <summary>
/// 首页任务栏
/// </summary>
public class TaskBar: BindableBase
{private string icon;/// <summary>/// 图标/// </summary>public string Icon{get { return icon; }set { icon = value; }}private string title;/// <summary>/// 标题/// </summary>public string Title{get { return title; }set { title = value; }}private string content;/// <summary>/// 内容/// </summary>public string Content{get { return content; }set { content = value; }}private string color;/// <summary>/// 背景颜色/// </summary>public string Color{get { return color; }set { color = value; }}private string target;/// <summary>/// 触发目标/// </summary>public string Target{get { return target; }set { target = value; }}}
  • 接着,在ViewModel 中,创建出TaskBar数据的动态集合,给页面展示数据
 public class IndexViewModel:BindableBase{public IndexViewModel(){TaskBars=new ObservableCollection<TaskBar>();CreateTaskBars();}private ObservableCollection<TaskBar> taskBars;public ObservableCollection<TaskBar> TaskBars{get { return taskBars; }set { taskBars = value; RaisePropertyChanged(); }}void CreateTaskBars(){TaskBars.Add(new TaskBar() { Icon="ClockFast",Title="汇总",Content="9",Color="#FF0CA0FF",Target=""});TaskBars.Add(new TaskBar() { Icon = "ClockCheckOutline", Title = "已完成", Content = "9", Color = "#FF1ECA3A", Target = "" });TaskBars.Add(new TaskBar() { Icon = "ChartLineVariant", Title = "完成比例", Content = "9%", Color = "#FF02C6DC", Target = "" });TaskBars.Add(new TaskBar() { Icon = "PlaylistStar", Title = "备忘录", Content = "18", Color = "#FFFFA000", Target = "" });}}
  •  最后,在ItemsControl 中,进行数据绑定
<ItemsControl Grid.Row="1" ItemsSource="{Binding TaskBars}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><UniformGrid Columns="4"/></ItemsPanelTemplate></ItemsControl.ItemsPanel><!--模板内容设计--><ItemsControl.ItemTemplate><DataTemplate><Border Background="{Binding Color}" CornerRadius="5" Margin="10"><Grid><StackPanel Margin="20,10"><!--图标--><materialDesign:PackIcon Kind="{Binding Icon}" Width="30" Height="30" /><!--标题文本--><TextBlock Text="{Binding Title}" Margin="0,15" FontSize="15"/><!--内容--><TextBlock Text="{Binding Content}" FontWeight="Bold" FontSize="40"/></StackPanel><!--白色背景底色控件--><Canvas ClipToBounds="True"><Border Canvas.Top="10" CornerRadius="100" Canvas.Right="-50" Width="120" Height="120" Background="#ffffff" Opacity="0.1"/><Border Canvas.Top="80" CornerRadius="100" Canvas.Right="-30" Width="120" Height="120" Background="#ffffff" Opacity="0.1"/></Canvas></Grid></Border></DataTemplate></ItemsControl.ItemTemplate>
</ItemsControl>

  • 第三行设计,当前行,分两列放置内容

  1. LastChildFill 属性,设置成False,不填允最后一列
  2. Button 按钮,样式希望变成图角,可以使用组件带的默认样式来实现,如下
Style="{StaticResource MaterialDesignFloatingActionAccentButton}"
<Grid Grid.Row="2" Margin="0,10"><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><!--外边框--><Border Margin="10,0" Background="#BEBEBE" CornerRadius="5" Opacity="0.1"/><Border Grid.Column="1" Margin="10,0" Background="#BEBEBE" CornerRadius="5" Opacity="0.1"/><!--主体内容左--><DockPanel Margin="10,0"><DockPanel Margin="10,5" LastChildFill="False" DockPanel.Dock="Top"><TextBlock Text="待办事项" FontSize="20" FontWeight="Bold"/><Button Width="30" Height="30" VerticalAlignment="Top" DockPanel.Dock="Right" Style="{StaticResource MaterialDesignFloatingActionAccentButton}" ><materialDesign:PackIcon Kind="Add" /></Button></DockPanel><!--数据列表区域--><ListBox /></DockPanel><!--主体内容右--><DockPanel  Grid.Column="1" Margin="10,0"><DockPanel Margin="10,5" LastChildFill="False" DockPanel.Dock="Top"><TextBlock Text="待办事项" FontSize="20" FontWeight="Bold"/><Button Width="30" Height="30" VerticalAlignment="Top" DockPanel.Dock="Right" Style="{StaticResource MaterialDesignFloatingActionAccentButton}" ><materialDesign:PackIcon Kind="Add" /></Button></DockPanel><!--数据列表区域--><ListBox /></DockPanel>
</Grid>

 二.Index.xaml 完整源码

<UserControl x:Class="MyToDo.Views.IndexView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:MyToDo.Views"mc:Ignorable="d" xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"d:DesignHeight="450" d:DesignWidth="800"><Grid><Grid.RowDefinitions><RowDefinition Height="auto"/><RowDefinition Height="auto"/><RowDefinition/></Grid.RowDefinitions><TextBlock Margin="15,10" FontSize="22" Text="你好,WPF! 今天是2023-11-12 星期天"/><ItemsControl Grid.Row="1" ItemsSource="{Binding TaskBars}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><UniformGrid Columns="4"/></ItemsPanelTemplate></ItemsControl.ItemsPanel><!--模板内容设计--><ItemsControl.ItemTemplate><DataTemplate><Border Background="{Binding Color}" CornerRadius="5" Margin="10"><Grid><StackPanel Margin="20,10"><!--图标--><materialDesign:PackIcon Kind="{Binding Icon}" Width="30" Height="30" /><!--标题文本--><TextBlock Text="{Binding Title}" Margin="0,15" FontSize="15"/><!--内容--><TextBlock Text="{Binding Content}" FontWeight="Bold" FontSize="40"/></StackPanel><!--白色背景底色控件--><Canvas ClipToBounds="True"><Border Canvas.Top="10" CornerRadius="100" Canvas.Right="-50" Width="120" Height="120" Background="#ffffff" Opacity="0.1"/><Border Canvas.Top="80" CornerRadius="100" Canvas.Right="-30" Width="120" Height="120" Background="#ffffff" Opacity="0.1"/></Canvas></Grid></Border></DataTemplate></ItemsControl.ItemTemplate></ItemsControl><Grid Grid.Row="2" Margin="0,10"><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><!--外边框--><Border Margin="10,0" Background="#BEBEBE" CornerRadius="5" Opacity="0.1"/><Border Grid.Column="1" Margin="10,0" Background="#BEBEBE" CornerRadius="5" Opacity="0.1"/><!--主体内容左--><DockPanel Margin="10,0"><DockPanel Margin="10,5" LastChildFill="False" DockPanel.Dock="Top"><TextBlock Text="待办事项" FontSize="20" FontWeight="Bold"/><Button Width="30" Height="30" VerticalAlignment="Top" DockPanel.Dock="Right" Style="{StaticResource MaterialDesignFloatingActionAccentButton}" ><materialDesign:PackIcon Kind="Add" /></Button></DockPanel><!--数据列表区域--><ListBox /></DockPanel><!--主体内容右--><DockPanel  Grid.Column="1" Margin="10,0"><DockPanel Margin="10,5" LastChildFill="False" DockPanel.Dock="Top"><TextBlock Text="待办事项" FontSize="20" FontWeight="Bold"/><Button Width="30" Height="30" VerticalAlignment="Top" DockPanel.Dock="Right" Style="{StaticResource MaterialDesignFloatingActionAccentButton}" ><materialDesign:PackIcon Kind="Add" /></Button></DockPanel><!--数据列表区域--><ListBox /></DockPanel></Grid></Grid>
</UserControl>

相关文章:

  • PyCharm 【unsupported Python 3.1】
  • Vue3与Vue2:前端进化论,从性能到体验的全面革新
  • c语言-数据结构-栈和队列的实现和解析
  • 微信如何设置自动保存图片和视频
  • demo(二)eurekaribbon----服务注册、提供与消费
  • C语言初学3:变量和常量
  • 【数据结构】希尔排序(最小增量排序)
  • java 旋转方阵
  • 【C++面向对象】13. 接口 / 抽象类*
  • C#几种截取字符串的方法
  • cmmlu数据处理
  • 《持续交付:发布可靠软件的系统方法》 - 目录
  • Windows内的Ubuntu虚拟机安装docker
  • Django路由层之有名分组和无名分组、反向解析、路由分发、伪静态的概念、名称空间、虚拟环境、Django1和Django2的区别
  • 国内领先的五大API接口供应商
  • 分享一款快速APP功能测试工具
  • gcc介绍及安装
  • GraphQL学习过程应该是这样的
  • JavaScript的使用你知道几种?(上)
  • jquery cookie
  • Next.js之基础概念(二)
  • OSS Web直传 (文件图片)
  • Phpstorm怎样批量删除空行?
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 程序员该如何有效的找工作?
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 分类模型——Logistics Regression
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 利用DataURL技术在网页上显示图片
  • 深度学习中的信息论知识详解
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 小程序测试方案初探
  • 用简单代码看卷积组块发展
  • 再谈express与koa的对比
  • 《天龙八部3D》Unity技术方案揭秘
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • #Linux(Source Insight安装及工程建立)
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (12)Linux 常见的三种进程状态
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (python)数据结构---字典
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (已解决)什么是vue导航守卫
  • (正则)提取页面里的img标签
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .chm格式文件如何阅读
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NetCore 如何动态路由
  • .NET开发者必备的11款免费工具