4

我正在开发一个 C#/WPF 中的小型应用程序,该应用程序由串行端口的数据提供。它还读取包含一些常量的文本文件以计算某些内容。当数据到达时,事件处理程序用于处理传入的数据:

_serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Receive);

这是 Receive 处理程序,以及在 Dispatcher 中创建的委托,用于进一步更新 UI。

private delegate void UpdateUiTextDelegate(string text);

private void Receive(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    // collect characters received to our 'buffer' (string)
    try
    {
        // stops long running output timer if enabled
        if (dispatcherTimer.IsEnabled)
        {
            dispatcherTimer.Stop();
        }

        message = _serialPort.ReadLine();

        dispatcherTimer.Start();
        Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(updateUI), message);
    }
    catch (Exception ex)
    {
        // timeout                
        dispatcherTimer.Start();
        SerialCmdSend("SCAN");
    }            
}

dispatcherTimer如果它未能在合理的时间内获取任何数据,则允许重新向串行线路上的单元发送命令。

除了从文本文件中读取之外,该应用程序在主窗口的构造函数中定义了一些键盘快捷键手势:

public MainWindow()
{
    InitializeComponent();
    InitializeComponent();

    KeyGesture kg = new KeyGesture(Key.C, ModifierKeys.Control);
    InputBinding ib = new InputBinding(MyCommand, kg);
    this.InputBindings.Add(ib);

    Start();
}

所以 MainWindow.xaml 有这个命令绑定代码:

<Window.CommandBindings>
    <CommandBinding Command="{x:Static custom:MainWindow.MyCommand}"
                    Executed="MyCommandExecuted"
                    CanExecute="CanExecuteMyCommand" />
</Window.CommandBindings>

Visual Studio Designer 抱怨标记无效,但仍然可以正常运行,直到我在运行程序时开始收到这些错误:

PresentationFramework.dll 中出现“System.Windows.Markup.XamlParseException”类型的未处理异常

附加信息:'对与指定绑定约束匹配的'Vaernes.MainWindow'类型的构造函数的调用引发了异常。行号“4”和行位置“9”。

进行小的代码更改后会出现这种错误。最新的是将程序读取的文本文件替换为另一个同名的文件(添加现有项目...)。我在网上搜索了一些解决方案,但找不到与我的问题非常相似的任何解决方案。

我怀疑它与 Dispatcher 线程或输入绑定有关。我还尝试为异常添加处理程序,并注意到发件人是 System.Windows.Threading.Dispatcher。

建议任何人?

4

1 回答 1

13

在大多数(如果不是全部)情况下,运行时XamlParseException是从构造函数内部抛出的异常。

要解决它,您必须获取 InnerException(可能还有它的 InnerException)和调用堆栈。然后修复它。

如果在调试期间没有发生异常,您可以在构造函数中尝试/捕获异常并记录所有必要的数据。

于 2013-05-16T08:51:59.850 回答