gpt4 book ai didi

c# - 在隐藏按钮上触发 Button.PerformClick()

转载 作者:行者123 更新时间:2023-11-30 20:25:02 31 4
gpt4 key购买 nike

我正在开发一个 C# WinForms 应用程序,其中有许多进程都由“主”应用程序管理。在这个主应用程序中,每个进程都由其自己的 FlowLayoutPanel 可视化,其中包含许多用于各种功能的按钮。我将这些面板称为“流程 block ”。

然而,当许多这样的过程完成后,并不是所有的 block 都能轻易地放在屏幕上。出于这个原因,我正在实现一种“紧凑模式”,它隐藏了所有流程 block 的所有按钮,只留下它们的名称、它们的状态和可见的开始/停止按钮。然后,我将 ContextMenuStrip 分配给每个流程 block ,其中我将所有按钮显示为 ToolStripMenuItem,这样我就可以通过这种方式访问​​流程 block 的所有功能。我正在动态清除这些 ContextMenuStrip 并在菜单打开时添加项目。为此,我遍历 FlowLayoutPanel 的所有子控件,查看它们是否属于 Button 类型,如果是,我将它们添加到 ContextMenuStrip。请参阅下面的代码片段:

private void PanelCmsOpened(object sender, EventArgs e) {
try {
ContextMenuStrip cMenuStrip = (ContextMenuStrip) sender;
// Clear all items from the context menu
cMenuStrip.Items.Clear();
// Loop over all controls in the FlowLayoutPanel
foreach (var c in CPanel.Controls) {
Button btn = c as Button;
if (btn == null) continue; // Not a button, continue
// Get the text from the button
string lbl = btn.Text;
if (string.IsNullOrEmpty(lbl)) {
try {
// The button has no text (only an icon), so we get the tooltip text of the button
lbl = PanelTooltip.GetToolTip(btn);
}
catch {
// We can't get any text to display, so skip this button
continue;
}
}
// Add a new item to the ContextMenuStrip
cMenuStrip.Items.Add(new ToolStripMenuItem(lbl,
btn.BackgroundImage,
(s, ea) => btn.PerformClick() // Perform a click on the button
)
{
Enabled = btn.Enabled
});
}
}
catch (Exception Ex) {
MessageBox.Show("Fout bij openen van context menu: " + Ex.Message, "Fout", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

问题:现在一切正常,只要按钮可见。但是,当进入紧凑模式时,我通过设置它们的 Button.Visible 属性来隐藏按钮。在那种情况下,什么也不会发生。我试过在 PerformClick 周围放置一个 try-catch block ,但没有抛出异常。只是什么也没发生。有谁知道如何使隐藏按钮起作用?

最佳答案

PerformClick 在执行点击之前检查按钮是否可用于点击。隐藏的按钮被认为是不可用的。您可以简单地在执行点击之前显示按钮,并在点击之后隐藏它:

 cMenuStrip.Items.Add(
new ToolStripMenuItem(lbl, btn.BackgroundImage, (s, ea) => {
var size = btn.Size;
btn.Size = Size.Empty; // button still will be invisible
btn.Show(); // make it clickable
btn.PerformClick();
btn.Hide(); // hide again
btn.Size = size; // restore original size
});

注意:如果你还需要添加一些可见的按钮,那么你应该单独处理它们以避免闪烁

 cMenuStrip.Items.Add(new ToolStripMenuItem(
lbl, btn.BackgroundImage, (s, ea) => ClickButton(btn)));

ClickButton 是一种根据按钮是否可见执行不同逻辑的方法:

private void ClickButton(Button button)
{
if (button.Visible)
{
button.PerformClick();
return;
}

var size = button.Size;
button.Size = Size.Empty;
button.Show();
button.PerformClick();
button.Hide();
button.Size = size;
}

关于c# - 在隐藏按钮上触发 Button.PerformClick(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25176017/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com