【问题标题】:AvaloniaUI How to inherit from TextBoxAvaloniaUI 如何从 TextBox 继承
【发布时间】: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 应该 被突出显示)。

所以出现了几个问题:

  1. 为什么我的子类的行为与其父类不同。当然它应该表现相同?
  2. 这只是某些 Avalonia 特有的怪异现象(即,也许 Avalonia 的渲染使用反射和 GetType() 会为这些不同的类返回不同的东西)?
  3. 如何创建自定义TextBox 控件?有没有可能(不用自己痛苦地重新创建它的所有功能)?

【问题讨论】:

    标签: c# inheritance textbox avaloniaui


    【解决方案1】:

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

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

    https://stackoverflow.com/a/51761372

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 2016-06-04
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      相关资源
      最近更新 更多