代码之家  ›  专栏  ›  技术社区  ›  Tri Q Tran

WPF-宽度和高度必须为非负

wpf
  •  7
  • Tri Q Tran  · 技术社区  · 14 年前

    我的申请遇到了一个奇怪的异常。直到我升级了我的开发机器(同一个OS+VS2010)并再次尝试调试软件,它一直运行良好。这是我得到的例外:

    宽度和高度必须为非负。

    堆栈跟踪:

     at System.Windows.Size..ctor(Double width, Double height)
       at System.Windows.Window.SourceWindowHelper.GetHwndNonClientAreaSizeInMeasureUnits()
       at System.Windows.Window.GetHwndNonClientAreaSizeInMeasureUnits()
       at System.Windows.Window.MeasureOverrideHelper(Size constraint)
       at System.Windows.Window.MeasureOverride(Size availableSize)
       at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
       at System.Windows.UIElement.Measure(Size availableSize)
       at System.Windows.ContextLayoutManager.UpdateLayout()
       at System.Windows.ContextLayoutManager.UpdateLayoutCallback(Object arg)
       at System.Windows.Media.MediaContext.InvokeOnRenderCallback.DoWork()
       at System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks()
       at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
       at System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget)
       at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
       at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
       at System.Windows.Threading.DispatcherOperation.InvokeImpl()
       at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
       at System.Threading.ExecutionContext.runTryCode(Object userData)
       at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Windows.Threading.DispatcherOperation.Invoke()
       at System.Windows.Threading.Dispatcher.ProcessQueue()
       at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
       at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
       at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
       at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
       at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
       at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
       at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
       at System.Windows.Threading.Dispatcher.Run()
       at System.Windows.Application.RunDispatcher(Object ignore)
       at System.Windows.Application.RunInternal(Window window)
       at System.Windows.Application.Run(Window window)
       at System.Windows.Application.Run()
       at AdvancedConsole2._0.App.Main() in F:\Projects\hitech\AdvancedConsole2.0\trunk\AdvancedConsole2.0\AdvancedConsole2.0\obj\x86\Debug\App.g.cs:line 0
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
    
    2 回复  |  直到 14 年前
        1
  •  7
  •   paxdiablo    14 年前

    你需要检查一下你的身高和宽度。这是一个相当安全的赌注,比其中一个或两个都是负数。我不会说这是肯定的,但我愿意在这上面赌很多钱

    为了它的价值,这个 可以 更改监视器分辨率时出现问题。有些人会做一个简单的计算,从屏幕大小中减去你的窗口大小,再除以2,使其居中。

    如果你的窗口比屏幕大,你可能会得到负值,无论是位置还是大小。

    没有看到计算宽度和高度的代码,这当然都是推测。我建议张贴和/或临时添加代码以某种方式输出它,以便您可以看到发生了什么。

        2
  •  2
  •   Colin P    8 年前

    我不想为此而受到赞扬,但paxdiablo提出一个展示问题是绝对正确的。如果我能发表评论支持他的话,我会的,但需要50个代表。

    这是我的问题:

    我最近刚开始使用3个显示器;我的笔记本电脑和两个22英寸的显示器。

    为了让它工作,我不得不在屏幕分辨率页面中移动监视器,直到我有了正确的顺序。这样做时,我无意中移动了一个显示器,使其高于其他显示器。Visual Studio在与其他两个监视器不对齐的监视器上崩溃。

    *修复*

    1. 右键单击桌面
    2. 选择屏幕分辨率
    3. 确保移动监视器屏幕,以便所有屏幕都在 最上层。
    4. 应用并单击“确定”。