【ArcGIS Pro二次开发】(83):ProWindow和WPF的一些技巧

news2024/11/18 5:29:06

在ArcGIS Pro二次开发中,SDK提供了一种工具界面【ArcGIS Pro ProWindow】。

关于ProWindow的用法,之前写过一篇基础的教程:

【ArcGIS Pro二次开发】(13):ProWindow的用法_arcgispro二次开发教程-CSDN博客

主要是对几个常用控件的简单使用进行介绍。

这一篇通过ProWindow讲一些WPF的技巧。


一、要实现的效果

 

要实现的效果比较简单,就是一个带图标的帮助键。

看着比较容易,但这里是想通过这个例子讲一下WPF的实现逻辑和样式定制,做的过程中感觉很有意思,就记录下来。


二、实现流程

首先在解决方案中右键点【添加】——【新建项】,选择【ArcGIS Pro ProWindow】,如下图所示:

从工具箱拖1个Button控件到主界面中,样式是系统默认的,比较丑:

修改样式。在下方的XAML界面中找到Button的代码,直接修改:

在属性行中修改边框(BorderBrush),背景色(Background):

    <Grid>
        <Button Content="Button" BorderBrush="#FF81BAF9" Background="White" HorizontalAlignment="Left" Margin="120,0,0,0" VerticalAlignment="Center"/>
    </Grid>

修改圆角的话就比较麻烦一点,需要修改Template,边框,背景色等属性也要在Template中重写:

    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Margin="120,0,0,0" VerticalAlignment="Center">
            <Button.Template>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border BorderThickness="1" BorderBrush="#FF81BAF9" CornerRadius="2" Background="White">
                        <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center"/>
                    </Border>
                </ControlTemplate>
            </Button.Template>
        </Button>
    </Grid>

效果如下:

对比最开始给的效果图,按钮内部有一个图片和一个文本,显示这不是用属性可以直接设置的,而是在内容放了2个控件【Image和TextBlock】。2个控件水平排列,就再加个StackPanel:

    <Grid>
        <Button HorizontalAlignment="Center" VerticalAlignment="Center" Height="23" Width="70">
            
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                <Image Source="/CCTool;component/Data/Icons/help.png" Height="16"/>
                <TextBlock Text="帮助"  Margin="8,0,0,0" VerticalAlignment="Center"/>
            </StackPanel>

            <Button.Template>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border BorderThickness="1" BorderBrush="#FF81BAF9" CornerRadius="2" Background="White">
                        <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center"/>
                    </Border>
                </ControlTemplate>
            </Button.Template>
        </Button>
    </Grid>

需要注意这里Image的源图片,需要设置生成操作为【资源】,如果是英文版的话,就是【Resource】,不然是不会正常显示的。

生成结果如下:

至此已经实现了我们想要达到的效果。


三、样式【Style】的妙用

如果只是实现上面的效果,并不值得专门写一篇文,本文最主要的是想说一下样式的用法。

如果每一个按钮都要写上面一大段代码实在很繁琐,这时候样式【Style】就显得很有用了。

首先把Grid上方那块Resources代码删掉:

然后在这个位置输入Window.Resources,里面放Style,给它个key【btn_xx】,名字随意,主要是将来控件调用的时候会用到。

把刚才写的那段内容给放在Style里,不过需要注意几个控件的内容要用【Grid】给包起来:

    <Window.Resources>
        <Style x:Key="btn_xx" TargetType="{x:Type Button}">
            <Setter Property="Background" Value="White"/>
            <Setter Property="BorderBrush" Value="#FF81BAF9"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Grid>
                            <Border x:Name="border" CornerRadius="2" Background="White" BorderBrush="#FF81BAF9" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="true">
                                <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                            </Border>
                            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                                <Image Source="/CCTool;component/Data/Icons/help.png" Height="16"/>
                                <TextBlock Text="帮助"  Margin="8,0,0,0" VerticalAlignment="Center"/>
                            </StackPanel>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

然后button在调用的时候,就不用写那么多代码了,一行就够:

    <Grid>
        <Button Style="{StaticResource btn_xx}" Height="24" Width="70"/>
    </Grid>

这里就加了一个Style=,调用刚才写的Style的key即可。

实现的效果不变,下次再添加按钮就方便多了:

到这里还没有完,虽然Style被提取出去,简化了很多,但还有更好的解决思路,就是【资源词典】。

在项目中添加一个【资源词典(WPF)】:

然后也不用重新写那一大段,可以在资源词典中直接生成。

但是首先,要先把刚才写的那一大段【样式】删除,改成这样一段:

    <controls:ProWindow.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/CCTool;component/WpfStyle.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </controls:ProWindow.Resources>

是中间一行引用的就是刚才新建的资源词典,注意路径,我的是新建在根目录下,所以component后面直接跟着WpfStyle.xaml。

然后拖一个button控件过来,右键点击【编辑模板】—【编辑副本】:

定义位置到刚才新建的资源字典中:

这时候再打开WpfStyle.xaml就会发现里面多了一长串代码:

注意这里的这个【x:Key = ButtonStyle】就是刚刚生成的样式。

下面就是一个很完整的样式,可以在这里面随意更改,修改好后,同样的在button里调用Style="{StaticResource ButtonStyle}"即可。

资源字典的好处是可以跨项目使用。自己积累下来的样式,可以在以后的项目中调用,而不局限于当前项目,因此是很有用的。

样式还有一些其它有意思的内容,如继承等,等后面研究透了再来吧。

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

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

相关文章

Codeforces Round 930 (Div. 2 ABCDEF题) 视频讲解

A. Shuffle Party Problem Statement You are given an array a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1​,a2​,…,an​. Initially, a i i a_ii ai​i for each 1 ≤ i ≤ n 1 \le i \le n 1≤i≤n. The operation swap ( k ) \texttt{swap}(k) swap(k) for an…

Java练习(第5天)【总结】在字符串中寻找特定的字符(5种方法)

问题描述&#xff1a;在字符串中寻找特定字符 1、第1次出现位置 实现函数原型&#xff1a; int indexOf(char c) Java代码&#xff1a; import java.io.*; public class Way_1 {public static void main(String args[]){String str "Geeks for Geeks is a computer s…

智能边缘小站 CloudPond(低延迟、高带宽和更好的数据隐私保护)

智能边缘小站 CloudPond(低延迟、高带宽和更好的数据隐私保护) 边缘小站的主要功能是管理用户在线下部署的整机柜设施&#xff0c;一个边缘小站关联一个华为云指定的区域和一个用户指定的场地&#xff0c;相关的资源运行状况监控等。 边缘计算 迈入5G和AI时代&#xff0c;新…

【嵌入式实践】【芝麻】【设计篇-2】从0到1给电动车添加指纹锁:项目可行性分析

0. 前言 该项目是基于stm32F103和指纹模块做了一个通过指纹锁控制电动车的小工具。支持添加指纹、删除指纹&#xff0c;电动车进入P档等待时计时&#xff0c;计时超过5min则自动锁车&#xff0c;计时过程中按刹车可中断P档状态&#xff0c;同时中断锁车计时。改项目我称之为“芝…

Arcgis重分类

对于一张土地分类图&#xff0c;有时需要改变他的类型对应的值&#xff0c;如何在Arcgis中完成这个操作&#xff1f; 有时候&#xff0c;需要对土地利用类型的水土保持因子P进行赋值&#xff0c;林地、草地赋值给1&#xff0c;水田0.15&#xff0c;旱地0.35&#xff0c;水域、…

FreeRTOS学习笔记——FreeRTOS中断管理

什么是中断&#xff1f; 简介&#xff1a;让CPU打断正常运行的程序&#xff0c;转而去处理紧急的事件&#xff08;程序&#xff09;&#xff0c;就叫中断 例&#xff1a; 中断执行机制&#xff0c;可简单概括为三步&#xff1a; 中断优先级分组设置 ARM Cortex-M 使用了 8 位…

抽象类及抽象方法、多态(类,接口)、对象转型(自动,强转)、内部类(成员,静态,接口,局部,匿名内部类)--学习JavaEE的day16

day16 Day16 抽象类及抽象方法 //抽象类 public abstract class 类名{//抽象方法public abstract void method(); }abstract 关键字&#xff0c;用来修饰类和方法 不能与final&#xff0c;static&#xff0c;private一起修饰&#xff0c;不能被重写 抽象类 1.概念&#xff…

2024最新AI系统ChatGPT网站源码, AI绘画系统

一、前言说明 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持…

C# aes加密解密byte数组

using System.Security.Cryptography; using System.Text;namespace AESStu01;public class AesHelper {// AES加密密钥和向量&#xff08;需要保密&#xff09; private static readonly string Key "";//16长度字符串数字混合private static readonly string IV …

web漏洞与规避

文章目录 一、XSS 跨站脚本攻击1.1 XSS攻击的主要类型反射型XSS存储型XSSDOM型XSS 1.2 前端开发如何应对XSS 二、CSRF 跨站请求伪造2.1 CSRF例子2.2 前端开发如何应对CSRF 三、SQL 注入3.1 前端如何防御SQL注入 四、前端如何使用CSP 一、XSS 跨站脚本攻击 攻击者通过在受害者的…

Kubernetes 学习总结(46)—— Pod 不停重启问题分析与解决

我们在做性能测试的时候&#xff0c;往往会发现我们的pod服务&#xff0c;频繁重启&#xff0c;通过kubectl get pods 命令&#xff0c;我们来逐步定位问题。 现象:running的pod&#xff0c;短时间内重启次数太多。 定位问题方法:查看pod日志 kubectl get event …

寻找峰值[中等]

优质博文IT-BLOG-CN 一、题目 峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组nums&#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个峰值 所在位置即可。 你可以假设nums[-1] nums[n] -∞。 你…

解决:Information:java: javacTask: 源发行版 8 需要目标发行版 1.8

解决&#xff1a;Information:java: javacTask: 源发行版 8 需要目标发行版 1.8 先点击 Project Structure 查看jdk是否为1.8版本 我这jdk版本为1.8版本的&#xff0c;但还是运行还是报错 据以上错误显示以及上述配置&#xff0c;我选择的编译器是jdk1.8的&#xff0c;但是在i…

Git LFS Github 提交大文件

问题背景 2024-03-03 一篇微服务系统测试工具的论文&#xff0c;事后发现自己一开始的理解有问题&#xff0c;导致自己算的预期值和论文中正确的值不一样。 测试工具原型的依赖定义有缺失&#xff0c;默认可能会用当前最新版&#xff0c;但时过境迁”最新版“变化会导致不兼容…

4款塞纸条盲盒交友源码,可以对接公众号

一元盲盒交友源码/脱单盲盒源码/交友盲盒/恋爱盲盒公众号版 可以对接自己支付&#xff0c;全部自定义 没有任何bug版本&#xff0c;已经测试完全可以 免费源码&#xff0c;不包搭建指导 源码下载地址专业知识分享社区-专业知识笔记免费分享 (chaobiji.cn)

springcloud:3.3测试重试机制

服务提供者【test-provider8001】 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 相关接口 测试远程调用&#xff1a;http://localhost:8001/payment/index 服务消费者【test-consumer-resilience4j8004】 Openfeign远程调用消费者搭建 文章地址http:/…

Git与GitHub:解锁版本控制的魔法盒子

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

计算机设计大赛 深度学习机器视觉车道线识别与检测 -自动驾驶

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分…

MyBatis 学习(七)之 缓存

目录 1 MyBatis 缓存介绍 2 一级缓存 3 二级缓存 3.1 二级缓存介绍 3.2 二级缓存配置 3.3 二级缓存测试 4 参考文档 1 MyBatis 缓存介绍 MyBatis 缓存是 MyBatis 中的一个重要特性&#xff0c;用于提高数据库查询的性能。MyBatis 提供了一级缓存和二级缓存两种类型的缓存…

数据结构:栈和队列的实现附上源代码(C语言版)

目录 前言 1.栈 1.1 栈的概念及结构 1.2 栈的底层数据结构选择 1.2 数据结构设计代码&#xff08;栈的实现&#xff09; 1.3 接口函数实现代码 &#xff08;1&#xff09;初始化栈 &#xff08;2&#xff09;销毁栈 &#xff08;3&#xff09;压栈 &#xff08;4&…