Silverlight:获取ContentTemplate中的命名控件
时间:2022-04-23
本文章向大家介绍Silverlight:获取ContentTemplate中的命名控件,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
项目开发中遇到一个要求,需要将ComboBox右侧中的小三角箭头给去掉,通过Blend工具“编辑ComboBox的模板副本”得知,这是一个名为"BtnArrow"的Path。但是在CS代码中,是无法引用到这个控件的。
解决办法:重新定义一个类,继承自ComboBox,然后重写OnApplyTemplate方法,代码如下
using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
namespace ContentTemplateTest
{
public class YJMComboBox : ComboBox
{
public bool IsShowDropDownArrow
{
get { return (bool)GetValue(IsShowDropDownArrowProperty); }
set { SetValue(IsShowDropDownArrowProperty, value); }
}
public static readonly DependencyProperty IsShowDropDownArrowProperty =
DependencyProperty.Register("IsShowDropDownArrow", typeof(bool), typeof(YJMComboBox), new PropertyMetadata(true, OnIsShowDropDownArrowChanged));
static void OnIsShowDropDownArrowChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
YJMComboBox _yjmCombobox = obj as YJMComboBox;
if (_yjmCombobox != null)
{
if ((bool)args.NewValue)
{
_yjmCombobox._DropDownToggleButton.Visibility = Visibility.Visible;
}
else
{
_yjmCombobox._DropDownToggleButton.Visibility = Visibility.Collapsed;
}
}
}
private Path _DropDownToggleButton = new Path();
public override void OnApplyTemplate()
{
_DropDownToggleButton = GetTemplateChild("BtnArrow") as Path;
base.OnApplyTemplate();
}
}
}
我增加了一个BOOL型的依赖属性IsShowDropDownArrow,并在OnApplyTemplate方法重载时获取了BtnArrow的引用,然后在IsShowDropDownArrow属性变化时,修改了BtnArrow的可视性。
注:
//
// Summary:
// 在实例化的 System.Windows.Controls.ControlTemplate 可视化树中检索已命名的元素。
//
// Parameters:
// childName:
// 要查找的元素的名称。
//
// Returns:
// 模板中的命名元素(如果已找到)。如果在模板中找不到具有名称 childName 的元素,则可能返回 null。
protected DependencyObject GetTemplateChild(string childName);
通过查看GetTemplateChild方法的定义得知,这是一个Protected方法,所以只能在子类中使用,这也就是为什么在常规Xaml.cs文件中无法获取ContentTemplate中命名控件的原因。
剩下的事情就简单了,来测试一把!
xaml文件如下:
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:System="clr-namespace:System;assembly=mscorlib" x:Class="ContentTemplateTest.MainPage"
mc:Ignorable="d"
xmlns:local="clr-namespace:ContentTemplateTest"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="White">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
<local:YJMComboBox HorizontalAlignment="Center" VerticalAlignment="Center" Width="100" x:Name="cbo">
</local:YJMComboBox>
<Button Content="Test" HorizontalAlignment="Center" VerticalAlignment="Top" Click="Button_Click" Margin="10,0,0,0"></Button>
</StackPanel>
</Grid>
</UserControl>
Xaml.cs部分:
using System.Windows;
using System.Windows.Controls;
namespace ContentTemplateTest
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
this.cbo.IsShowDropDownArrow = !this.cbo.IsShowDropDownArrow;
}
}
}
运行截图:
按下按钮前
按下按钮后
- 纳税服务系统五(登陆与系统拦截)【配置系统、子系统首页、登陆与拦截】
- 纳税服务系统六(信息发布管理模块)【Ueditor、异步信息交互、抽取BaseService、条件查询、分页】
- 纳税服务系统七(投诉管理模块)【显示投诉信息、处理回复、我要投诉、Quartz自动受理、统计图FusionCharts】
- Unikernel初体验
- Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
- Scala学习教程笔记一之基础语法,条件控制,循环控制,函数,数组,集合
- Kafka的生产者和消费者代码解析
- Caused by: java.lang.ClassNotFoundException: backtype.storm.topology.IRichSpout
- 作为完美主义者(强迫症)如何将linux的eth1网卡修改为eth0网卡
- 【入门篇】一个小白在Jetson TX2上安装caffe的踩坑之旅
- 【入门篇】Jetson TX2深度学习Inference初体验
- zeromq的安装,部署(号称最快的消息队列,消息中间件)
- OpenDaylight新建HelloWorld工程并集成版本
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【CMake教程】(四)CMake 配置生成lib或者so的库文件
- 使用 GitHub README profile 展示更多信息
- 算法工程师-SQL进阶:集合之间的较量
- 算法工程师-SQL进阶:神奇的自连接与子查询
- 算法工程师-SQL进阶:温柔的陷阱-NULL
- SpringBoot 异步任务处理
- SpringBoot整合 ActiveMQ快速入门 实现点对点推送
- Tomcat部署SpringBoot war包
- Vue之插槽Slot理解
- Docker六脉神剑 (三) 编写Dockerfile构建nginx镜像并推送到远程仓库给其他人使用
- 快速学习UML类图查看
- 设计模式 | 抽象工厂模式
- 设计模式 | 单例模式
- macOS 安装软件已损坏无法打开解决办法 (真好用!)
- nginx 配置反向代理