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;
        }
    }
}

运行截图:

按下按钮前

按下按钮后

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏闻道于事

Java实现word文档在线预览,读取office(word,excel,ppt)文件

8K7
来自专栏JackieZheng

Spring读书笔记——bean加载

我们的日常开发几乎离不开Spring,他为我们的开发带来了很大的便捷,那么Spring框架是如何做到方便他人的呢。今天就来说说bean如何被加载加载。 我们在x...

2199
来自专栏君赏技术博客

HQ移动20170317期周报

删除缓存:rm ~/Library/Caches/CocoaPods/search_index.json

1103
来自专栏恰童鞋骚年

ASP.Net请求处理机制初步探索之旅 - Part 5 ASP.Net MVC请求处理流程

开篇:上一篇我们了解了在WebForm模式下一个Page页面的生命周期,它经历了初始化Init、加载Load以及呈现Render三个重要阶段,其中构造了页面控件...

1393
来自专栏GIS讲堂

excel中提取中文拼音

概述:在工作时,有时候会用到汉语拼音,本文讲述如何在Excel中通过vba程序提取汉字的拼音。

1903
来自专栏hbbliyong

WPF备忘录(3)如何从 Datagrid 中获得单元格的内容与 使用值转换器进行绑定数据的转换IValueConverter

一、如何从 Datagrid 中获得单元格的内容    DataGrid 属于一种 ItemsControl, 因此,它有 Items 属性并且用ItemCon...

3747
来自专栏跟着阿笨一起玩NET

Winfrom 如何安全简单的跨线程更新控件

来源:http://www.cnblogs.com/rainbowzc/archive/2010/09/29/1838788.html

741
来自专栏魂祭心

原 结合源码分析 setTimeout /

3656
来自专栏青蛙要fly的专栏

项目需求讨论-Vlayout来快速构建及扩展复杂界面

大家好,今天又带来了项目中具体遇到的需求。做一个首界面,该首界面有很多功能块,同时这些功能块是动态的,因为登录的人的权限的不同,会显示不同的功能块,因为功能模块...

2102
来自专栏Java架构沉思录

深入理解-Spring-之源码剖析IOC(一)

作为Java程序员,Spirng我们再熟悉不过,可以说比自己的女朋友还要亲密,每天都会和他在一起,然而我们真的了解spring吗?

1003

扫码关注云+社区

领取腾讯云代金券