我的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()方法也是没问题的。
(这里是文档结束)