防止按钮获得焦点

时间:2012-10-30 23:38:45

标签: c# windows-mobile compact-framework windows-mobile-6.5

我有一个包含多种形式的解决方案,每种形式都有TextBox的/控件和一个显示SIP的按钮(底部栏是隐藏的)。

当用户点击我的SIP按钮时,SIP已启用,但焦点现在是按钮。我希望用户单击按钮 - 要显示的SIP,但焦点将保留在用户单击按钮之前具有焦点的控件上。有谁知道如何做到这一点?感谢。

2 个答案:

答案 0 :(得分:1)

您可以通过从Control类派生并覆盖OnPaint方法来创建自定义按钮,而不是使用标准按钮。在处理Click事件时(在VS2008 netcf 2.0上测试),以这种方式创建的控件在默认情况下不会声明焦点。

public partial class MyCustomButton : Control
{
    public MyCustomButton()
    {
        InitializeComponent();
    }

    protected override void OnPaint(PaintEventArgs pe)
    {
        pe.Graphics.DrawString("Show SIP", Font, new SolidBrush(ForeColor), 0, 0);
        // Calling the base class OnPaint
        base.OnPaint(pe);
    }
}

答案 1 :(得分:0)

nathan的解决方案也适用于Compact Framework或本机Windows Mobile应用程序。在文本框中,GotFocus设置了一个全局var,并在按钮单击事件中使用它将焦点设置回最后一个活动文本框:

    //global var
    TextBox currentTB = null;
    private void button1_Click(object sender, EventArgs e)
    {
        inputPanel1.Enabled = !inputPanel1.Enabled;
        if(currentTB!=null)
            currentTB.Focus();
    }

    private void textBox1_GotFocus(object sender, EventArgs e)
    {
        currentTB = (TextBox)sender;
    }

问候

约瑟夫

编辑:带有TextBox子类的解决方案:

class TextBoxIM: TextBox{
    public static TextBox tb;
    protected override void OnGotFocus (EventArgs e)
    {
        tb=this;
        base.OnGotFocus (e);
    }
}
...
private void btnOK_Click (object sender, System.EventArgs e)
{    
    string sName="";
    foreach(Control c in this.Controls){
        if (c.GetType()==typeof(TextBoxIM)){
            sName=c.Name;
            break; //we only need one instance to get the value
        }
    }
    MessageBox.Show("Last textbox='"+sName+"'");
    }

然后,而不是放置TextBox使用TextBoxIM。