WPF之多种视图切换

news2024/11/26 13:58:22

1,View切换,效果呈现

  • 视图1

  • 视图2

  • 视图3

2,在Xaml中添加Listview控件,Combobox控件。

<Grid >
        <Grid.RowDefinitions>
            <RowDefinition Height="143*"/>
            <RowDefinition Height="30"/>
        </Grid.RowDefinitions>
        <ListView Grid.IsSharedSizeScope="True" x:Name="listview01" BorderBrush="Red" BorderThickness="2" ></ListView>
        <StackPanel Grid.Row="1" Orientation="Horizontal">
            <TextBlock Text="选择视图模式:" VerticalAlignment="Center"></TextBlock>
            <ComboBox x:Name="combo01" SelectionChanged="combo01_Selected"  MinWidth="150" VerticalContentAlignment="Center">
                <sys:String>GirdView</sys:String>
                <sys:String>ImageDetailView</sys:String>
                <sys:String>ImageView</sys:String>
            </ComboBox>
        </StackPanel>
    </Grid>

3,自定义显示的视图。

 [ContentProperty("ItemTemplate")]
    /// <summary>
    /// 自定义的显示视图
    /// </summary>
    public class TitleView : ViewBase
    {
        /// <summary>
        /// ListViewItem数据模板,对应的是ListView的每一项
        /// </summary>
       public DataTemplate ItemTemplate
        {
            get; set;
        }
        /// <summary>
        /// 选中时的背景颜色
        /// </summary>
        public Brush SelectedBackgroundBrush { get; set; } = new SolidColorBrush(Colors.Transparent);
        /// <summary>
        /// 选中时的前景颜色
        /// </summary>
        public Brush SelectedForegroundBrush { get; set; } = new SolidColorBrush(Colors.Black);
        /// <summary>
        /// ListView默认样式资源建,根据此键从Themes文件下资源字典Generic.xaml中获取默认的ListView样式
        /// </summary>
        protected override object DefaultStyleKey
        {
            get
            {
                //根据反射可知只要两个 public ComponentResourceKey(Type typeInTargetAssembly, object resourceId);
                //中typeInTargetAssembly相同,resourceId相同则两个实例的hashcode相同,equal为 True 即两个实例相等
                return new ComponentResourceKey(GetType(),"TitleView");
            }
        }
        /// <summary>
        /// ListViewItem默认样式资源键,根据此键从Themes文件下资源字典Generic.xaml中获取默认的ListViewItem样式
        /// </summary>
        protected override object ItemContainerDefaultStyleKey
        {
            get
            {
                return new ComponentResourceKey(GetType(),"TitleViewItem") ;
            }
        }
    }
  • ListView.View:类型为ViewBase。
  • ViewBase为抽象类,系统只有一个派生类:GridView。
  • ListView.View用于表达ListViewItem中数据呈现的方式,在某一程度上可用ItemTemplate代替。
  •  使用ComponentResourceKey指定资源而不是使用字符串指定资源。

4,定义默认样式。

  • 同自定义无外观控件一样,其默认的样式也必须位于Themes文件夹下的资源字典Generic.xaml
 <Style x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:TitleView} ,ResourceId=TitleViewItem}" TargetType="ListViewItem"  >
        <Setter Property="ContentTemplate" Value="{Binding RelativeSource={RelativeSource  Mode=FindAncestor, AncestorType=ListView}, Path=View.ItemTemplate}"></Setter>
        <!--<Setter Property="Grid.IsSharedSizeScope" Value="True"></Setter>-->

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListViewItem">
                    <Border x:Name="Part_Border" Background="Transparent">
                        <ContentPresenter ></ContentPresenter>
                    </Border>
                    
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter TargetName="Part_Border" Property="Background" Value="{Binding RelativeSource={RelativeSource  Mode=FindAncestor, AncestorType=ListView}, Path=View.SelectedBackgroundBrush}"></Setter>
                            <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource  Mode=FindAncestor, AncestorType=ListView}, Path=View.SelectedForegroundBrush}"></Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:TitleView} ,ResourceId=TitleView}" TargetType="ListView" >
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <WrapPanel></WrapPanel>
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListView">
                    <Border Margin="{TemplateBinding Margin}"  BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="5" Background="{TemplateBinding Background}">
                        <ScrollViewer Margin="{TemplateBinding Padding}">
                            <ItemsPresenter></ItemsPresenter>
                        </ScrollViewer>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

5,添加对象资源。

<Window.Resources>
        <GridView x:Key="GirdView">
            <GridViewColumn Header="Name" DisplayMemberBinding="{Binding ModelName}"></GridViewColumn>
            <GridViewColumn Header="Model" DisplayMemberBinding="{Binding ModelNumber}"></GridViewColumn>
            <GridViewColumn Header="Price" DisplayMemberBinding="{Binding UnitCost,  StringFormat={}{0:C2}}"></GridViewColumn>
        </GridView>
        <local:TitleView x:Key="ImageDetailView" SelectedBackgroundBrush="LightGreen" SelectedForegroundBrush="Red">
            <local:TitleView.ItemTemplate>
                <DataTemplate>
                    <Border BorderBrush="SkyBlue" BorderThickness="2" Margin="5" Padding="5" CornerRadius="5">
                        <Grid >
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="auto">
                                </ColumnDefinition>
                                <ColumnDefinition Width="auto" SharedSizeGroup="c1"></ColumnDefinition>
                            </Grid.ColumnDefinitions>
                            <Image Margin="2" Width="100" Source="/Img/1.jpg" Stretch="Fill"></Image>
                            <StackPanel Grid.Column="1">
                                <TextBlock Text="{Binding ModelName}" FontSize="16" FontWeight="Bold"></TextBlock>
                                <TextBlock Text="{Binding ModelNumber}" ></TextBlock>
                                <TextBlock Text="{Binding UnitCost, StringFormat={}{0:C2}}" ></TextBlock>
                            </StackPanel>
                        </Grid>
                    </Border>
                </DataTemplate>
            </local:TitleView.ItemTemplate>
        </local:TitleView>
        <local:TitleView x:Key="ImageView" SelectedBackgroundBrush="LawnGreen" SelectedForegroundBrush="Blue">
            <DataTemplate>
                <Border BorderBrush="Chocolate" BorderThickness="2" Margin="3" Padding="5">
                    <StackPanel Width="100">
                        <Image Source="/Img/2.jpg" Stretch="Fill"></Image>
                        <TextBlock Text="{Binding ModelName}" TextWrapping="Wrap"></TextBlock>
                    </StackPanel>
                </Border>
            </DataTemplate>
        </local:TitleView>
    </Window.Resources>
  • 在GridView中的GridViewColumn既设置属性DisplayMember也设置属性CellTemplate,那么GridViewColumn将会使用DisplayMember而忽略CellTemplate。

6,代码

 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            listview01.ItemsSource = DbStore.DAL.Factory.ProductsDal.QueryAll();
            combo01.SelectedIndex = 0;
        }

        private void combo01_Selected(object sender, RoutedEventArgs e)
        {
            //获取选中的模式
            string str = combo01.SelectedItem.ToString();
            ViewBase view = this.Resources[str] as ViewBase;
            listview01.View = view;
            
        }
    }

7,Demo链接

https://download.csdn.net/download/lingxiao16888/89280022

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1652173.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五款加密软件的对比分析|加密软件怎么选

从企业防泄密角度来说&#xff0c;加密软件是最有效的解决方案之一&#xff0c;通过对内部核心文档、图纸、代码、视频等各类文件进行加密。可以有效防止文件外发泄密、窃取、设备丢失导致的数据泄露。 下面主要对五款加密软件进行对比分析&#xff0c;帮助你快速选择一个适合…

gpt_academic的使用——含一键安装和接入其他API以及本地模型

https://github.com/binary-husky/gpt_academic/releases/ https://github.com/binary-husky/gpt_academic/wiki 安装

数据结构复习指导之二叉树

文章目录 二叉树 考纲内容 复习提示 1.二叉树的概念 1.1二叉树的定义及其主要特性 1.1.1二叉树的定义 1.1.2几种特殊的二叉树 1.1.3二叉树的性质 1.2二叉树的存储结构 1.2.1顺序存储结构 1.2.2链式存储结构 知识回顾 二叉树 考纲内容 &#xff08;一&#xff09;树…

Hive数据模型

Hive数据模型 1. 表&#xff08;Table&#xff09;&#xff1a; 表是数据库中的基本组成单位&#xff0c;用于存储数据。它由一系列的行和列组成&#xff0c;每行代表一个记录&#xff0c;每列代表一种属性或字段。创建表时&#xff0c;你需要定义列的数据类型、约束和索引等信…

开发中的一些专业术语,POJO、PO...

在 Java 开发中&#xff0c;以下是常见的设计模式和概念&#xff1a; PO&#xff08;Persistent Object&#xff09;&#xff1a;持久化对象&#xff0c;也称为实体类或数据对象。它是与数据库表结构对应的类&#xff0c;通常用于表示持久化数据的实体。PO 类的属性与数据库表的…

Windows端之Python3.9及以上高版本工程打包得到的exe逆向工程解包得到pyc文件进而得到py文件的流程实现

参考来自 【python逆向 pyc反编译】python逆向全版本通杀_python反编译pyc-CSDN博客https://blog.csdn.net/zjjcxy_long/article/details/127346296Pyinstaller打包的exe之一键反编译py脚本与防反编译_pyinstaller防止反编译-CSDN博客https://blog.csdn.net/as604049322/artic…

Java零拷贝技术实战

文章目录 引入传统IO内存映射mmap文件描述符sendFile测试总结 引入 为什么要使用零拷贝技术&#xff1f; 传统写入数据需要4次拷贝&#xff0c;如下图&#xff1a; 传统IO import java.io.*; import java.net.Socket;public class TranditionIOClient {private static fina…

​「Python绘图」绘制太极图

python 绘制太极 一、预期结果 二、核心代码 import turtlepen turtle.Turtle()print("开始绘制太极")radius 100 pen.color("black", "black") pen.begin_fill() pen.circle(radius/2, 180) pen.circle(radius, 180) pen.left(180) pen.circ…

小项目“谈笑风生”测试报告

文章目录 一、项目介绍1.1项目背景1.2功能介绍 二、测试环境三、测试执行过程3.1功能测试3.1.1登录页面测试3.1.2注册页面测试3.1.3主页面测试 3.2界面自动化测试3.2.1登录模块测试3.2.2注册模块测试3.2.3展示各种信息模块测试3.2.34聊天消息传送模块测试 四、测试结论与建议 一…

8.Redis

Redis是一个基于内存的key-value结构数据库&#xff0c;而mysql是通过数据文件&#xff0c;以二维表的方式存储在磁盘上。 优点 基于内存存储&#xff0c;读写性能高适合存储热点数据企业应用广泛 Redis目录文件 启动命令 redis-server.exe redis.windows.conf 退出命令 c…

☺☺☺☺☺☺☺栈的应用习题:有效的括号☺☺☺☺☺☺☺

目录 一解题思路&#xff1a; 二对解答代码分析&#xff1a; 三解答代码展示&#xff1a; 即浅学栈的创建后&#xff0c;可以简单利用其性质&#xff08;先进后出&#xff0c;后进先出&#xff09;来完成对一些题目的解答 如&#xff1a; 一解题思路&#xff1a; 这里我们可…

图数据库 之 Neo4j 与 AI 大模型的结合绘制知识图谱

引言 随着信息时代的到来&#xff0c;海量的文本数据成为了我们获取知识的重要来源。然而&#xff0c;如何从这些文本数据中提取出有用的信息&#xff0c;并将其以可视化的方式展示出来&#xff0c;一直是一个具有挑战性的问题。近年来&#xff0c;随着人工智能技术的发展&…

2024年开抖音小店需要多少钱?你真的知道吗?最新入驻条件及费用

大家好&#xff0c;我是电商花花。 现在仍然有很多想开抖店&#xff0c;想做抖音小店&#xff0c;但是很多人都不知道投资一家抖音小店需要多少钱&#xff0c;今天花花就给大家讲一下做一家抖音小店需要投入多少资金&#xff0c;以及具体投入到哪些方面。 我们就说一下个体店…

layui 数据表格 自动定位新增行位置

由于数据表格新增行后没有到新增到当前位置 继续增加的需求&#xff1a; 因为自己是新增行后到最后一行的 所以 就定位到最后一行 并且 高亮 高亮颜色浅 可自行更改 整理了一下 可根据 情况 修改 // 初始化滚动条位置变量 let tableScroll {scrollTob: 0,scrollLeft: 0,…

Shuffle Cards (STL rope平衡树库)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例1&#xff1a; 输入 5 1 2 3 输出 2 3 4 1 5 样例2&#xff1a; 输入 5 2 2 3 2 3 输出 3 4 1 2 5 样例3&#xff1a; 输入 5 3 2 3 1 4 2 4输出 3 4 1 5 2 思路&#xff1a; 这道题&…

windows端口复用

1. 概述 使用 HTTP.sys 中的 Net.tcp Port Sharing 服务&#xff0c;配合 WinRM 实现端口复用。 优点&#xff1a; HTTP.sys 为 windows 原生机制&#xff0c; WinRM 为 windows 自带功能&#xff0c;动作较小&#xff0c;不易触发主 动防御。 需要管理员权限。 2. 原理 (…

STM32 VS Code 扩展用户指南

系列文章目录 前言 一、视频教程快速入门 通过我们简单易学的视频教程&#xff0c;快速掌握新版本的使用方法&#xff1a; 二、功能描述 2.1 创建/导入项目 STM32 VS Code 扩展提供两种不同的项目创建选项&#xff1a; STM32CubeMX 项目&#xff1a; 这是一个依靠 CMake 作为…

线下预约线下消费万能DIY小程序源码系统 带完整安装代码包

在数字化时代&#xff0c;线上线下融合的消费模式已成为新趋势。为满足广大商家对于个性化预约系统的需求&#xff0c;我们隆重推出了“线下预约线下消费万能DIY小程序源码系统”。该系统不仅具备完整的安装代码包&#xff0c;还提供了丰富的定制功能&#xff0c;助力商家轻松搭…

【大比武01】AIGC赋能档案文创设计的尝试

关注我们 - 数字罗塞塔计划 - 随着科技的飞速发展&#xff0c;AI技术逐渐深入我们的工作与生活&#xff0c;特别是随着2022年底ChatGPT的横空出世&#xff0c;AIGC&#xff08;Artificial Intelligence Generated Content&#xff0c;内容生成式人工智能&#xff09;开始登上历…

Covalent引入五个新网络运营商,提升去中心化特性和数据安全性

为了进一步扩大运营商基础以并践行去中心化网络基础设施的宗旨&#xff0c;Covalent Network&#xff08;CQT&#xff09;在网络中引入了五个新的区块样本生产者&#xff08;BSPs&#xff09;角色。该举措不仅重申了 Covalent Network&#xff08;CQT&#xff09;对社区驱动协议…