首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AvaloniaUI如何从TextBox继承

AvaloniaUI如何从TextBox继承
EN

Stack Overflow用户
提问于 2020-09-29 16:36:35
回答 1查看 746关注 0票数 1

因此,我试图使用Avalonia框架创建一个自定义TextBox控件,该控件支持SecureString (基本上我希望覆盖OnTextInput())。

对我来说,最明显的方法是直接继承TextBox。像这样

代码语言:javascript
运行
复制
namespace myProject.UI.Controls
{
    public class ProtectedTextBox : TextBox
    {
    }
}

据我对继承的理解,ProtectedTextBox现在的行为应该与它派生的TextBox完全一样。

然而,在使用我的ProtectedTextBox时,它似乎根本不被呈现。我确信我只是做了一些愚蠢的错误,但对于我的生活,我不知道为什么它不起作用。

预期行为:

这是我用于测试的axaml代码:

代码语言:javascript
运行
复制
<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派生)时,我不会期望有什么不同。

代码语言:javascript
运行
复制
<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. 为什么我的子类的行为与它的父类不同。当然,它的行为也应该是一样的吗? classes)?
  2. How,

  1. ,这只是一些Avalonia特有的奇怪之处(例如,Avalonia的渲染使用反射和GetType(),这会为这些不同的TextBox返回不同的东西,我会创建一个定制的TextBox控件吗?)它是否有可能(不痛苦地自己重新创建所有的功能)?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-08 23:44:36

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

代码语言:javascript
运行
复制
public class MyTextBox : TextBox, IStyleable
{
    Type IStyleable.StyleKey => typeof(TextBox);
    ...

请参阅https://stackoverflow.com/a/51761372

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64123929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档