Compact Framework中的模态对话框创建的无模式对话框

时间:2013-05-21 19:12:42

标签: compact-framework nested-forms

我正在开发Compact Framework应用程序。这种特殊的硬件实现有一个触摸屏,但其软输入面板的按钮太小而无法使用。有多个表单需要键入输入,所以我创建了一个表单,其按钮布局像键盘。使用此“键盘”形式的表单是模态对话框。加载需要此“键盘”的对话框时,我将“小键盘”形式加载为无模式:

    private void CardInputForm_Load(object sender, EventArgs e)
    {
        ...
        keypadForm = new KeypadForm();
        keypadForm.Owner = this;
        keypadForm.SetCallback(keyHandler);
        keypadForm.Show();
    }

SetCallback方法告诉“键盘”表单发送击键的位置(作为委托)。 我遇到的问题是无模式“键盘”形式不接受输入。它按照我的预期显示,但是当我按下任何按钮时,我发出一声蜂鸣声,其标题显示为灰色。似乎模态对话框阻止了它。 我已经阅读了这个论坛上的其他帖子,其中说明模态对话框可以创建&使用无模式对话框。任何人都可以了解这种情况吗?我的实施有问题吗?

1 个答案:

答案 0 :(得分:0)

我找到了答案:将键盘表单的Parent属性(而不是其Owner属性)设置为需要键击的表单实例。键盘对话框的标题栏保持灰色,但表单处于活动状态。

    private void CardInputForm_Load(object sender, EventArgs e)
    {
        // (do other work)
        keypadForm = new KeypadForm();
        keypadForm.Parent = this;
        keypadForm.Top = 190;         // set as appropriate
        keypadForm.Show();
    }

确保在完成父表单后进行清理。这可以在父母的Closing或Closed事件中。

    private void CardInputForm_Closing(object sender, CancelEventArgs e)
    {
        // (do other work)
        keypadForm.Close();
        keypadForm.Dispose();
    }

键盘上有两个面板,一个带有数字,另一个带有我想要的字母和标点符号。面板上没有两个共用的区域,包含用于清除,退格,输入/确定和取消的按钮。每个面板都有一个隐藏自身的按钮,并取消隐藏其对应部分(例如'ABC','123')。我在键盘上输入了所有按钮,触发了一个常见的事件。它只是将按钮实例发送给父实例。父母负责确定所需的动作或击键。在我的例子中,我将按钮命名为“btnA”,“btnB”,“btn0”,“btn1”,“btnCancel”等。对于击键,父表单采用名称的最后一个字符来确定所需的键。这有点乱,但它确实有效。任何希望使用键盘形式的表单都继承自基类,定义了回调方法。

    public partial class TimeClockBase : Form
    {
        public TimeClockBase()
        {
            InitializeComponent();
        }

        // (other implementation-specific base class functionality)

        public virtual void KeyCallback(Button button)
        {
        }
    }

键盘表单上的点击事件如下所示。

    private void btnKey_Click(object sender, EventArgs e)
    {
        // play click sound if supported
        (Parent as TimeClockBase).KeyCallback(sender as Button);
    }

父表单中的方法如下所示。

    public override void KeyCallback(Button button)
    {
        switch (button.Name)
        {
            case "btnCancel":
                // setting result will cause form to close
                DialogResult = DialogResult.Cancel;
                break;
            case "btnClear":
                txtCardID.Text = string.Empty;
                break;
            // (handle other cases)
        }
    }