【发布时间】:2020-09-29 16:36:35
【问题描述】:
所以我正在尝试使用 Avalonia UI 框架创建一个支持 SecureString 的自定义 TextBox 控件(基本上我想覆盖 OnTextInput())。
对我来说显而易见的方法是直接从TextBox 继承。像这样
namespace myProject.UI.Controls
{
public class ProtectedTextBox : TextBox
{
}
}
根据我对继承的理解,ProtectedTextBox 现在应该与它所派生的 TextBox 完全一样。
但是,当使用我的ProtectedTextBox 时,它似乎根本没有被渲染。我确定我只是在这里犯了一些愚蠢的错误,但是对于我的生活,我无法弄清楚为什么它不起作用。
预期行为:
这是我用于测试的 axaml 代码:
<Frame xmlns="https://github.com/avaloniaui"
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:lControls="clr-namespace:myProject.UI.Controls;assembly=myProject"
mc:Ignorable="d" d:DesignWidth="1440" d:DesignHeight="900"
x:Class="myProject.UI.Frames.TestFrame">
<DockPanel Width="1440" Height="900">
<Panel DockPanel.Dock="Top" Background="Aqua">
<TextBox Width="200" Height="100" Background="Red"/>
</Panel>
<Panel/>
</DockPanel>
</Frame>
它产生了以下完美的输出:(我们有一个丑陋但正常工作的TextBox)
实际行为:
当我使用我的ProtectedTextBox(直接派生自TextBox)时,我预计不会有任何差异
<Frame xmlns="https://github.com/avaloniaui"
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:lControls="clr-namespace:myProject.UI.Controls;assembly=myProject"
mc:Ignorable="d" d:DesignWidth="1440" d:DesignHeight="900"
x:Class="myProject.UI.Frames.TestFrame">
<DockPanel Width="1440" Height="900">
<Panel DockPanel.Dock="Top" Background="Aqua">
<lControls:ProtectedTextBox Width="200" Height="100" Background="Red"/>
</Panel>
<Panel/>
</DockPanel>
</Frame>
但是它只是不可见并且不会被渲染。 (Avalonia DevTools 似乎知道它的存在,当在 LogicalTree 中选择它时,我的ProtectedTextBox 应该 被突出显示)。
所以出现了几个问题:
- 为什么我的子类的行为与其父类不同。当然它应该表现相同?
- 这只是某些 Avalonia 特有的怪异现象(即,也许 Avalonia 的渲染使用反射和
GetType()会为这些不同的类返回不同的东西)? - 如何创建自定义
TextBox控件?有没有可能(不用自己痛苦地重新创建它的所有功能)?
【问题讨论】:
标签: c# inheritance textbox avaloniaui