小编Mic*_*ska的帖子

触摸WPF按钮有时不会调用Windows 8下的单击处理程序

"当应用程序窗口没有焦点时,有时按钮触摸不会调用点击处理程序."

系统:

带有多点触控输入设备的Windows 8.1.

软件:

一个简单的WPF 4.5.2应用程序,只有一个按钮,可以记录是否调用了单击处理程序(只需创建一个新项目并添加一个带有单击处理程序的按钮到MainWindow).

现象:

通常,当触摸按钮时,会调用其单击处理程序.但是当应用程序窗口没有焦点时,有时单击处理程序不会在按钮触摸时调用(尽管按钮颜色变为蓝色).当应用程序窗口已经具有焦点时,触摸按钮始终有效.这种情况有时只会发生在具有不同触摸硬件的各种系统上(所有Windows 8.1).我从来没有在Windows 7上体验过它.无论窗口是否聚焦,鼠标都能正常工作.

(在发布和调试模式下发生,无论是否附带调试器)

测试:

我查看了Windows中的各种触摸设置并使用它进行了播放.我也重新校准触摸 - >没有区别.

当检查WPF按钮鼠标并触摸事件时,在错误情况下,最后收到的事件是PreviewMouseUp但没有Click!

当我查看收到的窗口消息(间谍++)时,我得到以下内容(WM_IME_SETCONTEXT,WM_GETTEXT,WM_NCHITTEST,WM_GETOBJECT被删除以获得更好的概述):

收到点击:

R WM_POINTERACTIVATE pmsd->lResult:FFFFFFFFFFFFFFFF
S WM_MOUSEACTIVATE hwndTopLevel:000503F8 nHittest:HTCLIENT uMsg:WM_POINTERDOWN
R WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
S WM_WINDOWPOSCHANGING lpwp:000000E9E3D9E410
R WM_WINDOWPOSCHANGING
S WM_WINDOWPOSCHANGED lpwp:000000E9E3D9E410
R WM_WINDOWPOSCHANGED
S WM_ACTIVATEAPP fActive:True dwThreadID:00000000
R WM_ACTIVATEAPP
S WM_NCACTIVATE fActive:True
R WM_NCACTIVATE
S WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
S WM_IME_NOTIFY dwCommand:IMN_OPENSTATUSWINDOW dwCommand:00000002 dwData:00000000
R WM_IME_NOTIFY
S WM_SETFOCUS hwndLoseFocus:(null)
R WM_SETFOCUS
R WM_ACTIVATE
S message:0x02CC [Unknown] wParam:00000000 lParam:00C50BA8
R message:0x02CC [Unknown] …
Run Code Online (Sandbox Code Playgroud)

.net wpf touch windows-8.1

6
推荐指数
1
解决办法
5027
查看次数

Debug.Assert()具有意外的副作用-搜索替代品

我经常使用断言来检测意外的程序状态。我认为断言是一个条件消息框,它立即停止所有线程,以便(按“重试”时)我可以检查当前应用程序状态。

不是这种情况!当断言消息打开时,我的wpf应用程序继续处理事件。这很荒谬,因为在进入调试器时,情况可能与断言最初“看到”的情况完全不同。您可能会遇到这样的情况:对要触发的断言的检查会通过断言本身进行更改,您可以递归执行方法-导致多个断言或状态,程序永远无法正常运行。

据我了解断言功能,这是设计上的问题。对话框与应用程序本身在同一GUI线程上运行,因此需要出于自身目的处理消息。但这通常具有所描述的副作用。

因此,我正在寻找一种断言替代方案,该替代方案应满足在调用时停止所有正在运行的线程的要求。解决方法是,有时使用“ Debugger.Break();”。如果没有调试器就无法启动(不幸的是)。

为了说明问题,请参见以下代码片段,该代码以最简化的方式产生了一些现象:

public partial class MainWindow : Window
{
  int _count = 0;

  public MainWindow()
  {
    InitializeComponent();
  }    
  private void onLoaded(object sender, RoutedEventArgs e)
  {
    test(); 
  }
  protected override void OnLocationChanged(EventArgs e)
  {
    base.OnLocationChanged(e);
  }    
  void test()
  {
    ++_count;
    Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() =>
    {
      test();
    }));

    Trace.TraceInformation(_count.ToString());
    Debug.Assert(_count != 5);
  }
}
Run Code Online (Sandbox Code Playgroud)

在运行代码时,请观看developer Studio的输出面板。您将看到数字上升到5,然后断言触发。但是当对话框打开时,数字仍在增加。因此,在断言处于打开状态时,断言的条件会发生变化!现在,检查主窗口-它仍然处于响应状态。在“ base.OnLocationChanged(e);”处设置一个断点,然后移动主窗口=>,您将到达该断点。但是请注意调用栈:

MainWindow.OnLocationChanged(System.EventArgs e)    
(…)    
System.dll!Microsoft.Win32.SafeNativeMethods.MessageBox(System.IntPtr 
System.dll!System.Diagnostics.AssertWrapper.ShowMessageBoxAssert(stri
System.dll!System.Diagnostics.DefaultTraceListener.Fail(string message, str 
System.dll!System.Diagnostics.DefaultTraceListener.Fail(string message)
System.dll!System.Diagnostics.TraceInternal.Fail(string message)
System.dll!System.Diagnostics.Debug.Assert(bool condition)
MainWindow.test()
MainWindow.test.AnonymousMethod__0()
Run Code Online (Sandbox Code Playgroud)

这清楚地表明断言打开时可以执行任意代码。

因此,我正在寻找一种像断言之类的机制,该机制将停止所有现有线程并在其自己的(线程)上下文中运行。有任何想法吗?

c# debugging wpf

5
推荐指数
1
解决办法
1004
查看次数

删除的zip文件会导致e.Data.GetData(“ FileContents”)引发异常

我正在尝试在WPF应用程序中为从zip存档中拖动的文件实现处理程序。处理程序应获取文件内容以进行进一步处理。

我的环境:Windows7,已安装7-zip,Visual Studio 2012 Express,.Net 4.5

这是一个简单的MainWindow应用程序的代码来演示该问题:

public partial class MainWindow : Window
{
  public MainWindow()
  {
    InitializeComponent();
    AllowDrop= true;
    Drop += onDrop;
  }

  private void onDrop(object sender, DragEventArgs e)
  {
    if (e.Data.GetDataPresent("FileContents"))
    {
      var fileContents = e.Data.GetData("FileContents");
      //get file contents...
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

当我将zip存档中包含的文件拖到我的Window时,对e.Data.GetData(“ FileContents”)的调用将引发System.ArgumentException(“ Argument out of Range”),并带有以下调用堆栈:

System.Windows.DataObject.OleConverter.GetDataInner(formatetc, medium)  
System.Windows.DataObject.OleConverter.GetDataFromOleHGLOBAL(format, aspect, index) 
System.Windows.DataObject.OleConverter.GetDataFromBoundOleDataObject(format, aspect, index) 
System.Windows.DataObject.OleConverter.GetData(format, autoConvert, aspect, index)  
System.Windows.DataObject.OleConverter.GetData(format, autoConvert) 
System.Windows.DataObject.GetData(format, autoConvert)  
System.Windows.DataObject.GetData(format)   
TestZip.MainWindow.onDrop(sender, e) Zeile 34   C#
Run Code Online (Sandbox Code Playgroud)

我已经查看了此OleConverter的源代码(http://reflector.webtropy.com/default.aspx/Dotnetfx_Win7_3@5@1/Dotnetfx_Win7_3@5@1/3@5@1/DEVDIV/depot/DevDiv/发布/ Orcas / NetFXw7 / wpf / …

.net c# wpf zip drag-and-drop

2
推荐指数
1
解决办法
2045
查看次数

标签 统计

wpf ×3

.net ×2

c# ×2

debugging ×1

drag-and-drop ×1

touch ×1

windows-8.1 ×1

zip ×1