AvaloniaUI 如何继承TextBox

问题描述 投票:0回答:2

所以我尝试使用 Avalonia UI 框架创建一个支持

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
should 会突出显示)。

所以出现了几个问题:

  1. 为什么我的子类的行为与父类不同。它的行为肯定应该是一样的吗?
  2. 这只是 Avalonia 特有的怪异之处吗(即,Avalonia 的渲染可能使用反射,并且
    GetType()
    会为这些不同的类返回不同的东西)?
  3. 如何创建自定义
    TextBox
    控件?有可能吗(不用我自己痛苦地重新创建它的所有功能)?
c# inheritance textbox avaloniaui
2个回答
6
投票

只需使用 StyleKey 并像这样实现 IStyleable 即可:

public class MyTextBox : TextBox, IStyleable
{
    Type IStyleable.StyleKey => typeof(TextBox);
    ...

参见https://stackoverflow.com/a/51761372


0
投票

这只是一个更新,因为 IStyleable 将在版本 0.12.0 中过时

对于当前和未来的版本,正确的方法是覆盖

样式键覆盖

public class MyTextBox : TextBox
{
    protected override Type StyleKeyOverride { get { return typeof(TextBox); } }
    .....
}
© www.soinside.com 2019 - 2024. All rights reserved.