【问题标题】:C# MessageBoxManager-Changing message box names not workingC# MessageBoxManager-更改消息框名称不起作用
【发布时间】:2022-11-03 22:58:25
【问题描述】:

我尝试在 C# 中创建消息框并使用消息框管理器自定义按钮的文本,但它仍然没有更改按钮的文本
我正在使用 c# .net6
MessageBoxManager 更改按钮的文本
我的代码:

MessageBoxManager.Yes = "Alright";
MessageBoxManager.No = "never";
string message = "test";
MessageBoxManager.Register();
MessageBox.Show(message, "test.exe", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
MessageBoxManager.Unregister();

MessageBoxManager
如果有人可以帮助我使用 MessageBoxManager 我将不胜感激,尽管没有它的答案也很好

【问题讨论】:

  • lior:你能找到另一个使用 MessageBoxManager 的解决方案吗?使用 TaskDialog 必须重新实现所有内容。

标签: c# messagebox


【解决方案1】:

对于 .NET Core 5 及更高版本,有 TaskDialog Class

TechNet Wiki article

是/否返回布尔值的简单示例。

public class Dialogs
{
 
    /// <summary>
    /// Dialog to ask a question
    /// </summary>
    /// <param name="caption">text for dialog caption</param>
    /// <param name="heading">text for dialog heading</param>
    /// <param name="yesText">text for yes button</param>
    /// <param name="noText">text for no button</param>
    /// <param name="defaultButton">specifies the default button for this dialog</param>
    /// <returns>true for yes button, false for no button</returns>
    public static bool Question(string caption, string heading, string yesText, string noText, DialogResult defaultButton)
    {

        TaskDialogButton yesButton = new (yesText) { Tag = DialogResult.Yes };
        TaskDialogButton noButton = new (noText) { Tag = DialogResult.No };
        
        TaskDialogButtonCollection buttons = new ();

        if (defaultButton == DialogResult.Yes)
        {
            buttons.Add(yesButton);
            buttons.Add(noButton);
        }
        else
        {
            buttons.Add(noButton);
            buttons.Add(yesButton);
        }

        TaskDialogPage page = new ()
        {
            Caption = caption,
            SizeToContent = true,
            Heading = heading,
            Icon = TaskDialogIcon.Information,
            Buttons = buttons
        };


        TaskDialogButton result = TaskDialog.ShowDialog(page);

        return (DialogResult)result.Tag == DialogResult.Yes;

    }

    [ModuleInitializer]
    public static void Init()
    {
        Application.EnableVisualStyles();
    }
}

重载到中心父以居中并使用不同的图标。

public static bool Question(Control owner, string heading, Icon icon, DialogResult defaultButton = DialogResult.Yes)
{

    TaskDialogButton yesButton = new("Yes") { Tag = DialogResult.Yes };
    TaskDialogButton noButton = new("No") { Tag = DialogResult.No };

    var buttons = new TaskDialogButtonCollection();

    if (defaultButton == DialogResult.Yes)
    {
        buttons.Add(yesButton);
        buttons.Add(noButton);
    }
    else
    {
        buttons.Add(noButton);
        buttons.Add(yesButton);
    }

    TaskDialogPage page = new()
    {
        Caption = "Question",
        SizeToContent = true,
        Heading = heading,
        Icon = new TaskDialogIcon(icon),
        Buttons = buttons
    };

    var result = TaskDialog.ShowDialog(owner, page);

    return (DialogResult)result.Tag == DialogResult.Yes;

}

【讨论】:

    【解决方案2】:

    这里的问题是,.Net 6/.NetCore 中的 AppDomain.GetCurrentThreadId() 返回 ManagedThreadId(经过调试测试)。 MessageBoxManager 中的 Register() 方法必须更改:必须将 AppDomain.GetCurrentThreadId() 替换为获取非托管 ThreadId 的方法。例如,这可以使用此处显示的本机方法http://www.pinvoke.net/default.aspx/kernel32/GetCurrentThreadId.html 来完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 2014-06-16
      • 1970-01-01
      • 2022-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多