因此,我试图使用Avalonia框架创建一个自定义TextBox控件,该控件支持SecureString (基本上我希望覆盖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 )。

因此,出现了几个问题:
,
GetType(),这会为这些不同的TextBox返回不同的东西,我会创建一个定制的TextBox控件吗?)它是否有可能(不痛苦地自己重新创建所有的功能)?发布于 2021-01-08 23:44:36
只需使用StyleKey并像这样实现IStyleable:
public class MyTextBox : TextBox, IStyleable
{
Type IStyleable.StyleKey => typeof(TextBox);
...https://stackoverflow.com/questions/64123929
复制相似问题