惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
C
Check Point Blog
B
Blog RSS Feed
G
Google Developers Blog
H
Help Net Security
博客园 - Franky
Blog — PlanetScale
Blog — PlanetScale
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Recent Announcements
Recent Announcements
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
DataBreaches.Net
小众软件
小众软件
T
The Blog of Author Tim Ferriss
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
Y
Y Combinator Blog
T
Tailwind CSS Blog
J
Java Code Geeks
MyScale Blog
MyScale Blog
雷峰网
雷峰网
有赞技术团队
有赞技术团队
博客园 - 聂微东

zodream梦想开源/个人编程日记

文件解析笔记-zodream梦想开源/个人编程日记 密码本开发笔记之读写与保存-zodream梦想开源/个人编程日记 SkiaSharp 把 pixel byte[] 转成 SKBitmap-zodream梦想开源/个人编程日记 nas 使用 Docker 安装 gogs-zodream梦想开源/个人编程日记 复制 android 手机中的文件到电脑-zodream梦想开源/个人编程日记 周报:寻找优质的周刊-zodream梦想开源/个人编程日记 开发日志:对Markdown的代码块新增引用来源支持-zodream梦想开源/个人编程日记 周报:怎么写技术类的教程文章-zodream梦想开源/个人编程日记 css display:flex 布局尺寸超出问题-zodream梦想开源/个人编程日记 周报:SEO优化的思考-zodream梦想开源/个人编程日记 Edge 浏览器不适用 Edge Image Viewer 打开图片 -zodream梦想开源/个人编程日记 SEO 学习笔记(一) 内容来源-zodream梦想开源/个人编程日记 PHP 实现双因素身份认证(2FA)-zodream梦想开源/个人编程日记 WPF MVVM 获取List 多选数据-zodream梦想开源/个人编程日记 Burp Suite 抓包-zodream梦想开源/个人编程日记 使用 indexnow 注意事项-zodream梦想开源/个人编程日记 Godot 使用字体图标 例如: Iconfont、FontAwesome-zodream梦想开源/个人编程日记 angular 15 对指定页面进行访问限制-zodream梦想开源/个人编程日记 CSS 使用 column-count 实现瀑布流出现内容分割的解决办法-zodream梦想开源/个人编程日记 input 确认按键事件在手机端不生效-zodream梦想开源/个人编程日记 C# 使用socket 进行通讯-zodream梦想开源/个人编程日记 Maui开发中Windows应用开启管理员权限-zodream梦想开源/个人编程日记 Maui 中自定义控件-zodream梦想开源/个人编程日记 angular 14 使用 ng-template 实现tree 结构显示-zodream梦想开源/个人编程日记 c# 动态安装和卸载dll-zodream梦想开源/个人编程日记 慎用 CompositionTarget.Rendering-zodream梦想开源/个人编程日记 c# 重写 c++ 程序笔记:数据初始化-zodream梦想开源/个人编程日记 源码编译 aseprite-zodream梦想开源/个人编程日记 记录一下字符串分隔split各语言之间的不同-zodream梦想开源/个人编程日记 c# Gzip解码无头内容-zodream梦想开源/个人编程日记
UWP Custom Control自定义控件开发-zodream梦想开源/个人编程...
zodream · 2021-04-28 · via zodream梦想开源/个人编程日记

Custom Control 又名 Templated Control 模板控件

开发

分为两个文件

一个资源文件 Themes/Generic.xaml 里面,主要放默认的模板及初始化属性

一个cs 文件 控件名.cs,主要放 声明属性及事件

一个简单的控件,由一个图标和文字组成的控件

public sealed class IconTag : Control
    {
        public IconTag()
        {
            this.DefaultStyleKey = typeof(IconTag);
        }

        /// <summary>
        /// 内容
        /// </summary>
        public string Label
        {
            get { return (string)GetValue(LabelProperty); }
            set { SetValue(LabelProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Label.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty LabelProperty =
            DependencyProperty.Register("Label", typeof(string), typeof(IconTag), new PropertyMetadata(null));


        /// <summary>
        /// 内容字体图标
        /// </summary>
        public string Icon
        {
            get { return (string)GetValue(IconProperty); }
            set { SetValue(IconProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Icon.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty IconProperty =
            DependencyProperty.Register("Icon", typeof(string), typeof(IconTag), new PropertyMetadata(null));
    }

12345678910111213141516171819202122232425262728293031323334

 <Style TargetType="local2:IconTag">
    <Setter Property="FontFamily" Value="Microsoft YaHei"/>
    <Setter Property="Margin" Value="0,0,10,0"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local2:IconTag">
                <Grid Margin="{TemplateBinding Margin}" Padding="{TemplateBinding Padding}">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <FontIcon Glyph="{TemplateBinding Icon}" FontSize="{TemplateBinding FontSize}" VerticalAlignment="Center"/>
                    <TextBlock Text="{TemplateBinding Label}" 
                                FontFamily="{TemplateBinding FontFamily}"
                                VerticalAlignment="Center" Grid.Column="1" FontSize="{TemplateBinding FontSize}"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

1234567891011121314151617181920

ControlTemplate就是放默认模板,

Setter Property= 就是声明一些初始化的属性

代码获取控件模板中的控件

必须先使用 x:Name 声明名称

 <Style TargetType="local2:IconTag">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local2:IconTag">
                <Grid Margin="{TemplateBinding Margin}" Padding="{TemplateBinding Padding}">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <FontIcon Glyph="{TemplateBinding Icon}" FontSize="{TemplateBinding FontSize}" VerticalAlignment="Center"/>
                    <TextBlock x:Name="Content" Text="{TemplateBinding Label}" 
                                FontFamily="{TemplateBinding FontFamily}"
                                VerticalAlignment="Center" Grid.Column="1" FontSize="{TemplateBinding FontSize}"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

123456789101112131415161718

必须声明模板必须包含 x:Name="Content" 且 类型为 TextBlock

    [TemplatePart(Name = "Content", Type = typeof(TextBlock))]
    public sealed class IconTag : Control {
        public IconTag()
        {
            DefaultStyleKey = typeof(IconTag);
            Loaded += IconTag_Loaded;
        }

        private void IconTag_Loaded(object sender, RoutedEventArgs e)
        {
            var tb = GetTemplateChild("Content") as TextBlock;
        }
    }

12345678910111213

通过 GetTemplateChild 获取控件,而且必须等控件加载完了才能获取到。

转载请保留原文链接: https://zodream.cn/blog/id/206.html