繁体   English   中英

C#,可访问性和只读

[英]C#, accessibility and readonly

我正在C#中开展一个相对复杂的工作管理计划。

所有数据输入表单都继承自使用相同自定义导航栏的父级(类似于BindingNavigator)。 默认情况下,在浏览记录时不会启用任何数据输入控件。 在编辑记录之前,用户必须明确启用编辑。 这很好用。 但是,我迁移整个项目的原因是为了让屏幕阅读器可以访问应用程序,然后我终于彻底失去了视力。

我的问题是如果未启用包含记录中数据的控件对屏幕阅读器完全不可见。 显而易见的答案是将它们设置为只读而不是禁用它们,这对于文本框,屏蔽文本框,NumericUpDown控件来说很好,但不适用于复选框,单选按钮或组合框。

有没有办法防止这些被更改,同时仍允许屏幕阅读器访问它们? 或者是否有人对上面列出的所有控件都有一致的解决方案?

提前致谢。

我们过去在WinForms中处理这个问题的方法是为每个控件制作自定义版本并自行实现readonly。

基本方法是拦截控件的相应“已更改”事件,并在控件指示它只是只读时恢复用户刚刚执行的操作。

对于复选框,这是一个非常粗略的实现:

public class MyCheckBox : CheckBox
{
    public bool ReadOnly {get; set;}
    private bool m_fInEvent;
    protected override void  OnCheckedChanged(EventArgs e)
    {
        if (ReadOnly) {
            if (!m_fInEvent) {
                try {
                    // Prevent infinite recursion
                    m_fInEvent = true;
                    this.Checked = !this.Checked;
                } finally {
                    m_fInEvent = false;
                } 
            }
        }
        base.OnCheckedChanged(e);
    }
}

假设您使用的是winform,也许您可​​以使用Autocheck来获取复选框。

对于组合框你可以试试这个:

stateComboBox.DropDownStyle = ComboBoxStyle.DropDownList;

我后来意识到应用程序中的单选按钮不受问题的影响。

最后,在使用ComboBox遇到很多困难之后,我想出了这两个类:

public class ReadOnlyCheckBox : CheckBox
{
    public bool ReadOnly { get; set; }
    protected override void OnKeyUp(KeyEventArgs e)
    {
        if (!ReadOnly)
        {
            base.OnKeyUp(e);
        }
    }
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (!ReadOnly)
        {
            base.OnKeyDown(e);
        }
    }
    protected override void OnMouseUp(MouseEventArgs e)
    {
        if (!ReadOnly)
        {
            base.OnMouseUp(e);
        }
    }
    protected override void OnMouseDown(MouseEventArgs e)
    {
        if (!ReadOnly)
        {
            base.OnMouseDown(e);
        }
    }
}
public class ReadOnlyComboBox : ComboBox
{
    public bool ReadOnly { get; set; }
    protected override void OnKeyUp(KeyEventArgs e)
    {
        if (ReadOnly)
        {
            e.Handled = true;
        }
        else
            base.OnKeyUp(e);

    }
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (ReadOnly)
        {
            e.Handled = true;
        }
        else
            base.OnKeyDown(e);
    }
    protected override void OnMouseDown(MouseEventArgs e)
    {
        if (!ReadOnly)
            base.OnMouseDown(e);
        else
        {
            Enabled = false;
            Enabled = true;
            this.Focus();
        }
    }
}

无论我尝试什么,Combo似乎总是处理键和鼠标事件,即使我没有调用基本方法。 因此这两个类别的方法不同。

KeyDown和KeyUp事件都必须被困在复选框中,因为默认情况下KeyDown事件会使复选框灰显,keyup事件实际上会检查框并恢复正常背景。

据我所知,它很强大,永远不会允许控件的状态发生变化,这可能会引发其他不需要的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM