2

我有一个 Windows 窗体应用程序,其中我将不同的功能拆分为多个用户控件。我希望这些用户控件中的每一个都有一个接受按钮。

这里有什么最佳实践吗?

我的想法是检测哪个用户控件具有焦点,然后将其设置在父窗体中。

还有其他想法吗?

4

5 回答 5

4

最佳实践通常是为您的表单设置一个接受按钮,以使其行为一致。如果根据表单的哪个部分具有焦点,点击返回会导致不同的操作,这通常会让用户感到困惑。但是,如果您有专门的应用程序或用户请求此功能,那么我认为您提出的解决方案会起作用。

于 2009-06-30T12:21:43.030 回答
2

Jan Miksovsky 有一个关于 UI 设计的优秀博客,并写了一篇关于这件事的文章

大多数 UI 平台都允许设计人员指示对话框中的哪个按钮应该是默认按钮:如果用户键入 Enter 键将被按下的按钮。默认按钮通常是用户接下来最有可能按下的按钮,通常是关闭对话框的 OK 按钮。在非常高流量的对话框中,您可能需要考虑动态更改默认按钮以节省击键并帮助加快用户的任务。

他使用的示例是 Microsoft Outlook 中的“选择名称”对话框,它会根据您的操作更改默认按钮。

于 2009-06-30T12:30:00.047 回答
1

我假设每个用户按钮都是各个用户控件上的自己的实例?

如果是这样,那么您可以捕获父窗体上的按钮事件。如果通过属性公开单个按钮,则可以绑定到它们的 Click 事件。像所有控件一样,它们具有 name 属性,因此您可以拥有一种在所有按钮单击事件上调用的方法。

下面我有一个部分示例代码。我有两个用户控件,每个控件都有一个按钮。UC1 上的按钮命名为“btn1”,UC2 为“btn2”。我将暴露的属性称为“ButtonOK”

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }

    public Button ButtonOK
    {
        get { return btn1; }
    }
}

public partial class UserControl2 : UserControl
{
    public UserControl2()
    {
        InitializeComponent();
    }

    public Button ButtonOK
    {
        get { return btn2; }
    }
}

现在在父级(“Form1”)上加载时有一个与每个按钮的 Click 事件相关的方法,但它调用相同的方法。在我测试“名称”属性的方法中。

    public Form1()
    {
        InitializeComponent();
    }

    void Form1_Load(object sender, EventArgs e)
    {
        RegisterButtonEvents();
    }

    void RegisterButtonEvents()
    {
        userControl11.ButtonOK.Click += new EventHandler(ButtonOK_Click);
        userControl21.ButtonOK.Click += new EventHandler(ButtonOK_Click);
    }

    void ButtonOK_Click(object sender, EventArgs e)
    {
        Button btn = sender as Button;
        if (btn != null)
        {
            if (btn.Name == "btn1")
            {
                Console.WriteLine(" ButtonOK from UserControl1 was pushed. The tag is " + btn.Tag.ToString());
            }
            else if (btn.Name == "btn2")
            {
                Console.WriteLine(" ButtonOK from UserControl2 was pushed. The tag is " + btn.Tag.ToString());
            }
        }
    }

您还可以使用控件的“标记”属性。此属性非常有用,因为它可以引用对象。

您不需要完全按照所示进行操作,但您可以使用任何“父”表单来获取对 UserControls 的引用,让它们公开其按钮,然后您可以使用这些按钮(或任何对此进行控制)。

请记住,如果您还绑定到用户控件上的单击事件(除了父表单),您将必须注意它将通过委托列表枚举并在之后执行代码的顺序事件开始。

希望有帮助。

于 2009-06-30T12:53:54.523 回答
1

我知道这是一个旧帖子,但我想我明白了。

在主窗体中的每个用户控件上使用“Enter”事件,这样当用户“进入”(聚焦)用户控件时,this.AcceptButton = myUserControlButton. 您还可以使用每个用户控件上的“离开”事件将接受按钮设置回默认值(如果有的话)。

于 2011-05-24T13:50:11.260 回答
0

我不确定我是否正确理解了您的问题。如果要将一个事件分配给多个按钮:

例如,您可以: - 获取 Button_Click 事件上的按钮名称。- 在名称之间枚举 - 遍历控件。


下面的示例: “如何从 Button_Click 事件中获取按钮名称”。

// First; dont forget to assign the "Button_Click" event to your Button(s).

private void Button_Click(object sender, EventArgs e)
{
    // The line bellow assigns to "btn" variable the currently clicked button.
    Button btn = (Button)sender;

    // Then using a switch block; you can compare the button name and
    // perform the action desired for the clicked button.
    switch(btn.Name)
    {
        case "buttonName1": /* Do Something Here */ break;
        case "buttonName2": /* Do Something Here */ break;
        // etc
    }
 }

此外; 如果您需要;总有办法通过公开它们来检索表单类之外的按钮。

于 2020-01-23T14:36:34.883 回答