WinUI3入门12:编写用户控件

发布于:2025-06-28 ⋅ 阅读:(15) ⋅ 点赞:(0)

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。

源码指引:github源码指引_初级代码游戏的博客-CSDN博客

C#是我多年以来的业余爱好,新搞的东西能用C#的就用C#了。


        TextBlock不能设置边框和背景,必须外面包一个Border或Grid,这非常不科学嘛。

        当我们需要组合一些现有控件的时候,我们需要使用“用户控件”。

        注意,是“用户控件”,不是“自定义控件”。这两者有什么区别呢?用户控件是现有控件的组合,自定义控件是全新的控件。

目录

一、创建用户控件

二、添加控件组合内容

三、操作属性

四、自定义属性屏蔽内部实现


一、创建用户控件

        项目右键-“添加”-“新建项”:

        这样就得到一个原始的用户控件“MyTextBox”,看一下生成的xaml文件:

<?xml version="1.0" encoding="utf-8"?>
<UserControl
    x:Class="Dos2UnixWinUI.MyTextBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Dos2UnixWinUI"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid>

	</Grid>
</UserControl>

         啥也没有,只有一个Grid。

        再看一下生成的cs文件:

	public sealed partial class MyTextBox : UserControl
	{
		public MyTextBox()
		{
			this.InitializeComponent();
		}
	}

        只有初始化组件。

二、添加控件组合内容

        添加内容和普通xaml没什么区别,在xaml的Grid里面添加:

    <Grid>
		<Border x:FieldModifier="public" x:Name="a" Background="Red">
			<TextBlock >123</TextBlock>
		</Border>
	</Grid>

        这就可以了。

        然后在窗体的xaml里面使用:

			<local:MyTextBox x:Name="my"/>

        直接运行就出来了:

三、操作属性

        我们前面给内置的Border起了名字“a”,a就是组合体的成员,类型为Border。

        我们在窗体使用组合体时也给了名字“my”,从my入手就可以操作:

my.a.Background = new Microsoft.UI.Xaml.Media.SolidColorBrush(Windows.UI.Color.FromArgb(255,0,255,0));

        这句代码设置Border的背景为绿色。

        这里还有个坑,主要是因为系统性的资料难找,有问题要到处搜。这个坑就是默认的x:Name定义的东西都是私有的,只能在自己的类内部使用,而用户控件是个独立的类,在窗口类里面当然不能访问了。

        解决办法就是加上【x:FieldModifier="public"】(前面代码里面已经有了)。

        上面代码效果如下:

        说明生效了。

        到这里我们已经可以随意处理了。只是这样会暴露内部结构,也不算很理想。

四、自定义属性屏蔽内部实现

        我们可以通过自定义属性来避免暴露内部实现。

        比如背景色:

		public new Microsoft.UI.Xaml.Media.Brush Background
		{
			get => a.Background;
			set => a.Background = value;
		}

        将以上代码添加在cs文件里,就实现了MyTextBox的属性“Background”。

        这里又是个坑。基类UserControl里面已经有了Background属性,但是根据文档,不一定有什么用的,我们这里直接设置它也是没什么用的,我们直接覆盖掉。前面那个“new”就表示覆盖了基类的属性。

        现在我们可以这样操作:

my.Background = new Microsoft.UI.Xaml.Media.SolidColorBrush(Windows.UI.Color.FromArgb(255, 0, 255, 0));

        效果是一样的,不用暴露内部的结构。

        当然了,直接在cs里定义个SetBackground()方法也是没问题的。


(这里是文档结束)