4

シリアルポートからのデータが供給される C#/WPF の小さなアプリケーションに取り組んでいます。また、何かを計算するために、いくつかの定数を含むテキスト ファイルを読み取ります。着信データが到着したときにそれを処理するイベント ハンドラーが作成されます。

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

これは、UI をさらに更新するために Dispatcher で作成されたデリゲートと共に、Receive ハンドラーです。

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 は無効なマークアップについて不平を言いますが、プログラムの実行時にこれらのエラーが発生し始めるまでは、正常に実行されていました。

型 'System.Windows.Markup.XamlParseException' の未処理の例外が PresentationFramework.dll で発生しました

追加情報: 「指定されたバインディング制約に一致するタイプ 'Vaernes.MainWindow' でのコンストラクターの呼び出しにより、例外がスローされました。」行番号「4」と行位置「9」。

この種のエラーは、コードを少し変更した後に表示されます。最新のものは、プログラムによって読み取られたテキスト ファイルを、同じ名前の別のファイルに置き換えていました (既存の項目を追加...)。Web で解決策を検索しましたが、私の問題によく似たものは見つかりませんでした。

Dispatcher スレッドまたは入力バインディングのいずれかと関係があると思われます。また、例外のハンドラーを追加しようとしたところ、送信者が System.Windows.Threading.Dispatcher であることがわかりました。

提案は誰ですか?

4

1 に答える 1