Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF-如何消除错误的设计时错误_Wpf - Fatal编程技术网

WPF-如何消除错误的设计时错误

WPF-如何消除错误的设计时错误,wpf,Wpf,在设计时,我遇到了一些错误,这些错误似乎是由WPF在没有实际运行它们的情况下无法估计事物的价值造成的。当然,这在运行时可以完美地工作。 问题是我如何摆脱这些错误 以下是一个例子: 我在一个班上有以下两个: public static bool IsHubb {get; set;} public static bool IsEC { get { return !IsHubb; } } 以下转换器工作正常: public object Convert(object value, Type

在设计时,我遇到了一些错误,这些错误似乎是由WPF在没有实际运行它们的情况下无法估计事物的价值造成的。当然,这在运行时可以完美地工作。 问题是我如何摆脱这些错误

以下是一个例子:

我在一个班上有以下两个:

public static bool IsHubb {get; set;} 
public static bool IsEC { get { return !IsHubb; } }
以下转换器工作正常:

   public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (HubbCostOfferPage.IsHubb && HubbCostOfferPage.CarObj.TestApprovedDate == null)
            return Visibility.Visible;
        else
            return Visibility.Collapsed;
    }
但是,以下内容(尽管非常类似)给出了“对象引用未设置为对象的实例”。错误,这意味着在设计时,我唯一能看到的没有注释StaticResource定义的东西是一个大错误:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    if (HubbCostOfferPage.IsEC == true && HubbCostOfferPage.CarObj.TestApprovedDate == null)
        return Visibility.Visible;
    else
        return Visibility.Collapsed;
}
如果我将HubbCostOfferPage.IsEC替换为HubbCostOfferPage.IsHubb,则一切正常,因此我知道问题出在哪里

如果我将HubbCostOfferPage.IsEC替换为!在转换器中,我遇到了同样的问题。设计师似乎在抱怨,因为它无法在设计期间评估“!”


如何在设计时也能做到这一点,你有什么想法吗?

让设计师关掉它-这太麻烦了。将.xaml文件与代码编辑器关联(右键单击,用打开,然后设置为默认值),您将获得更快的体验,并且仍然拥有Intellisense。您可以在需要时使用Blend

public object Convert(/*snipped*/)
{
#if DEBUG
    if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv")
        return Visibility.Visible;
#endif
    if (HubbCostOfferPage.IsEC == true && HubbCostOfferPage.CarObj.TestApprovedDate == null)
        return Visibility.Visible;
    else
        return Visibility.Collapsed;
}
编辑:乍一看,设计师可能会抱怨,因为HubbCostOfferPage.CarObj为空。您也可以通过将代码更改为:

public object Convert(/*snipped*/)
{
    if (HubbCostOfferPage.IsEC && 
        HubbCostOfferPage.CarObj != null &&
        HubbCostOfferPage.CarObj.TestApprovedDate == null)
        return Visibility.Visible;
    else
        return Visibility.Collapsed;
}
if (HubbCostOfferPage.IsEC == true && ...
这也会产生副作用,成为更好的生产代码

第二次编辑以回应您的评论,因为这需要代码:


正如我所写的,用IsHubb替换IsEC解决了这个问题,并提出了一个解决方案!在IsEC导致之前,所以问题绝对不是CarObj

启动时,
IsHubb
被初始化为false。C#短路布尔逻辑,因此如下所示:

if (HubbCostOfferPage.IsHubb && ...
逻辑And之后的所有内容均未被评估。当您将代码更改为:

public object Convert(/*snipped*/)
{
    if (HubbCostOfferPage.IsEC && 
        HubbCostOfferPage.CarObj != null &&
        HubbCostOfferPage.CarObj.TestApprovedDate == null)
        return Visibility.Visible;
    else
        return Visibility.Collapsed;
}
if (HubbCostOfferPage.IsEC == true && ...
现在正在评估
&
之后的所有内容。诸如
bool
之类的整数类型不会成为“对象引用未设置为对象实例”的目标,而且显然
HubbCostOfferPage
不为空,因此可能的罪魁祸首是CarObj。没有看到您的代码,这只是一个建议的想法


至于问题的第二部分,调试指令只是编译出在发布模式下编译时设计器检查的代码。如果在发布模式下进行任何设计时编辑,则可以删除它们。您需要的部分是介于两者之间的所有内容。

根据Paul的回答,我建议不要检查is
CarObj
是否为null,因为在运行时将引发异常

我建议按如下方式更改转换器:

public object Convert(object value, Type targetType, object parameter,  
  System.Globalization.CultureInfo culture)  
{  
  if (ApplicationIsInDesignMode) { return Visibility.**WHATEVER YOU LIKE ***; }
  if (HubbCostOfferPage.IsEC == true && HubbCostOfferPage.CarObj.TestApprovedDate == null)
    return Visibility.Visible;
else
    return Visibility.Collapsed;
}

private static bool ApplicationIsInDesignMode
    {
        get { return (bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue); }
    }

这并不能完全回答这个问题,但对于一般情况,这是最好的建议:工具/选项/文本编辑器/XAML/Miscellaneous->“始终以完整的XAML视图打开文档”checked@Kent还没有,因为我对完整的XAML视图非常满意,但是看到您对它相当热情,下次我上WPF的时候我会试试的project@Kent:谢谢你的回答。如果我没有使用设计器,我就不会有这个问题,因为只有设计器显示错误,只要我忽略它,我就没有问题。这没用。@UrbanEsc:谢谢你的回答。这正是我在寻找的解决方案,某种背景下的东西。不幸的是,我尝试了您的解决方案,但似乎对错误消息没有任何影响-(正如我所写的,用IsHubb替换IsEC解决了问题,并在IsEC导致问题之前放置一个!来解决问题,因此问题绝对不是CarObj。因此,第二个解决方案不会有帮助。至于您的第一个解决方案,我不确定我是否正确:如果我正在处理项目并使用Debug进行编译,这是否意味着Debug是将要执行的部分?在这种情况下,它不能解决问题,因为它在运行应用程序时会出现错误。我编辑了我的答案,以便更全面地回答,但任何一段代码都应该适合您。感谢您花时间回答。您所说的一切都很有意义,这就是为什么这个问题让我非常困惑。我已经把ObjCar完全从转换器中取出,只是为了检查你是否有可能是对的,但遗憾的是,你错了。这与CarObj无关:即使转换器中没有提到CarObj,错误也会保持不变,但一旦IsEC离开,错误就会消失。Wh我很奇怪,因为你是对的,甚至不能为null。至于你关于调试的回答,这正是我所怀疑的。这意味着如果我使用该解决方案,我将在开发(=在调试中编译)时遇到问题这在发布模式中甚至不存在。这不是一个好主意。因此,如果将块更改为
if(HubbCostOfferPage.IsEC)
,放弃第二个检查,仍然会出现错误?您能澄清一下运行时抛出异常是什么意思吗??我很好奇为什么您认为检查null会导致运行时出现异常。@Paul:在设计时,有些对象可能是null的,因为没有调用工厂或其他对象,所以属性erty为null。我认为这是可以的。但是在运行时,属性不应为null。因此我相信不是Converter负责检查这个。但是当然,在某些情况下,对象可以为null,并且Converter不应抛出异常。您的解决方案的优点是,它可以用于解决还有其他问题。谢谢!:-)