jjzjj

.net - 带有验证和取消按钮的消息框

coder 2023-11-11 原文

我怎样才能有一个带有两个按钮的 msgbox,验证和取消?

最佳答案

不幸的是,标准的 Win32 MessageBox function不支持带有自定义标签的按钮。并且由于 VB.NET MsgBox function 是该 native 函数的瘦包装器,它也不支持它们。预定义的值就是你所得到的,这意味着你能做的最好的是“OK”和“Cancel”之类的东西,文本解释“OK”意味着“继续验证”。

值得注意的是,多年来,这是 Windows 风格指南认可的推荐做法。其实看起来是it still is .具体来说,请注意以下一般规则的异常(exception)情况:

Use positive commit buttons that are specific responses to the main instruction, instead of generic labels such as OK or Yes/No. Users should be able to understand the options by reading the button text alone.
Exceptions:

  • Use Close for dialogs that don't have settings, such as informational dialogs. Never use Close for dialogs that have settings.
  • Use OK when the "specific" responses are still generic, such as Save, Select, or Choose.
  • Use OK when changing a specific setting or a collection of settings.
  • For legacy dialog boxes without a main instruction, you can use generic labels such as OK. Often such dialog boxes aren't designed to perform a specific task, preventing more specific responses.
  • Certain tasks require more thought and careful reading for users to make informed decisions. This is usually the case with confirmations. In such cases, you can purposely use generic commit button labels to force users to read the main instructions and prevent hasty decisions.


Windows Vista 引入了一个新的 API,旨在取代陈旧且无法配置的 API MessageBox ——它叫做 TaskDialog .如果您运行的是 Windows Vista 或 7,您无疑会看到这个对话框在整个 Windows shell 中使用。事实上,它允许您为每个按钮指定自定义名称,并提供一系列其他自定义选项。但这种控制不是免费的。 TaskDialog有两个问题功能:
  • .NET Framework 不包括开箱即用的包装器。您需要编写自己的简单包装器,或者下载 Windows API Code Pack包括这样的包装器。但这会给您的代码增加了额外的依赖性——您必须决定这样做是否值得。
  • 由于 API 仅在 Vista 中引入,这意味着程序只能在 Vista 或更高版本上运行时才能使用它。如果您仍然需要以 Windows XP(或 2000)为目标,那么您就不走运了。显示 TaskDialog 的代码将失败,您需要包含一个回退例程来显示标准 MessageBox .这当然会让您回到开始的地方,而无法在那些传统操作系统上自定义按钮标签。同样,只有您可以决定这是否是您的应用程序和/或部署方案的重要问题。

  • 被几代 VB 程序员使用的另一种选择是敲响你自己的小 MessageBox式形式。布置一个带有图标/图像位置、一些标题文本和所有您想要的按钮的简单表单并不难。由于您已经创建了整个表单,因此您可以根据自己的意愿自由地从代码中对其进行自定义。

    如果您在 Vista 之前的 Windows 版本中绝对需要此功能,那么创建您自己的消息框表单是您唯一的选择。否则,我强烈建议您利用新的 TaskDialog应用程序接口(interface)。在您的应用程序中这样做可以促进与用户可能已安装在其计算机上的其他应用程序的一致性,甚至与 Windows 本身的一致性。很难确保您自己的自定义消息框表单得到正确的小改动,例如根据其长度和用户的屏幕大小自动包装标签文本。并根据您的对话框是否包含“取消”按钮来显示/隐藏标题栏中的“X”关闭按钮。以及令人难以置信的其他标准 Windows MessageBox/TaskDialog免费为您服务,无需您动动手指。这只是对一般原则的重申:当您绝对不需要这样做时,永远不要重新发明轮子。

    一个好的折衷方案可能是使用类似 this TaskDialog wrapper/emulator 的东西。 .在 Vista 及更高版本上, native TaskDialog API 可用,它会自动调用该函数。否则,它使用标准形式并尝试模拟 native TaskDialog 的行为。应用程序接口(interface)。我编写了一个类似的自定义类供我自己使用,但我从未在网上发布它。

    关于.net - 带有验证和取消按钮的消息框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6519451/

    有关.net - 带有验证和取消按钮的消息框的更多相关文章

    1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

      作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

    2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

      给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

    3. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

      我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

    4. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

      我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

    5. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

      我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

    6. ruby - 如何模拟 Net::HTTP::Post? - 2

      是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

    7. ruby-on-rails - 如何将验证与模型分开 - 2

      我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

    8. ruby-on-rails - 跳过状态机方法的所有验证 - 2

      当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

    9. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

      我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

    10. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

      我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

    随机推荐