【问题标题】:"Design Mode" preprocessor directive“设计模式”预处理器指令
【发布时间】:2011-06-16 20:09:46
【问题描述】:

我有一个 problem 在 Designer 中显示组件。

我发现了设计者不喜欢的“坏”代码。

现在,问题是我不能只使用预处理器指令在设计时“评论”它。

现在,我尝试了(对于 VB.NET)以下

#If Not Debug Then
Private Sub myWpfComponent_ItsEvent(sender, args) Handles myWpfComponent.ItsEvent
...
#End If 

这...有效,现在在设计器中显示没有问题。

现在这个组件恐怕无法调试正确的问题了。

所以,我正在寻找一种解决方法

#If Not DESIGN_TIME Then
#End If 

有类似的吗?

【问题讨论】:

  • @Daniel A. White:请参阅“问题”一词的链接。 Winforms Designer“不喜欢”处理 Wpf 托管控件上的事件。
  • 我不明白为什么必须使用预处理器指令来执行此操作。 DesignerProperties.GetIsInDesignMode method 有什么问题?

标签: .net wpf visual-studio visual-studio-2010 preprocessor


【解决方案1】:

您无法通过预处理器实现此目的。这是因为你可以在VS之外运行一个调试可执行文件(试一试,在调试模式下双击VS生成的EXE)。

无论如何,有一个运行时(不是基于预处理器的)属性可能会有所帮助:

if (System.ComponentModel.LicenseManager.UsageMode ==
    System.ComponentModel.LicenseUsageMode.Designtime)

这些网页将在运行时提供帮助并具有其他检查设计模式的方法:

http://msdn.microsoft.com/en-us/library/c58hb4bw(vs.71).aspx

http://weblogs.asp.net/fmarguerie/archive/2005/03/23/395658.aspx

【讨论】:

  • 基于 OP 提到的“myWpfComponent_ItsEvent”,这看起来像是一个 WPF 问题。您提到的属性是用于 WinForms,而不是 WPF。
  • 所引用的页面有其他检查设计的方法,请查看第二个链接
  • 我只能在方法中使用“if”。不在它之外:)
  • @serhio:那么你有一个基本的设计问题。如果您想真正修复它,那么将您的设计更改为编译器可以看到的东西(如果没有看到您的所有代码,我们无法告诉您如何做到这一点)。如果你想在它上面贴一个创可贴并让它暂时工作,那么使用 DEBUG 预处理器符号,然后只在发布模式下分发,或者定义你自己的预处理器符号并以这种方式修复症状。
  • 这个属性对我非常有用(出于另一个原因)+1
【解决方案2】:

IDE 不会重新构建您的代码以显示设计器。它使用您已经构建的二进制文件。所以预处理指令不会有帮助。

既然你提到了myWpfComponent_ItsEvent,我认为这是一个 WPF 问题。在 WPF 中,您可以使用 GetIsInDesignMode 检测设计模式。

【讨论】:

  • 是的。但是再看看我的代码。我需要“忽略”整个方法,或 VB 中的句柄,或 C# 中的事件附件。我不能使用经典的 "if" outside 方法(忽略所有方法)
  • 为什么要在方法外做呢?只需在您的方法中添加if (DesignerProperties.IsInDesignMode(this)) return; 作为第一件事。瞧:你的方法在设计模式下不再做任何事情。
【解决方案3】:

您的问题是在 WinForms 设计器中使用用 VB.NET 编写的 WPF 控件。如果事件处理程序导致问题,您可以使用AddHandler 而不是WithEventsHandles 来条件化处理程序代码。使用AddHandler 后,您可以使用@gmagana 的答案中描述的方法将处理程序添加到If 中。

有关 Handles 和 AddHandler 之间的区别,请参阅此答案:

【讨论】:

  • 说,WPF控件是用C#写的,但是宿主控件是用VB写的:)。无论如何,我想到了这个似乎是唯一可行的解​​决方案。谢谢。
【解决方案4】:

用途:

if (!DesignerProperties.GetIsInDesignMode(this))
{
   //Code to not execute in design mode
}

请注意,“this”标识符可以是任何 DependencyObject

【讨论】:

    猜你喜欢
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多