0

私は WPF/C# を初めて使用するので、これは多くの人にとって初歩的なことかもしれません。無知をお許しください。その場合、私が必要とするのは、あなたが役立つと思われる簡単なコード例へのポインターだけです。私はこれを検索しました..しかし、私を助けた既存の解決策を見つけることができなかったので、これはおそらく物事を行う方法ではないと思います...ポインタを使用してC ++で同様のことを行いましたが、これは私がしていたことではありませんC#.WPFで再現可能

とにかく、ここで私がやろうとしていることは次のとおりです。タブ付きの子を持つメインウィンドウがあり、すべて UserControl 型で、XAML で定義されています

<Window x:Class="HighPerformanceScenarios.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:igEditors="http://infragistics.com/Editors"
        xmlns:local="clr-namespace:HighPerformanceScenarios"
        Title="MainWindow" Height="600" Width="800" xmlns:ig="http://schemas.infragistics.com/xaml">
    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0" Background="LightBlue">
            <TextBlock Text="Infragistics High-Performance XamDataGrid and XamDataChart" FontSize="20" Margin="0 10 0 10"/>
        </StackPanel>
        <TabControl Grid.Row="1">
            <TabItem Header="XamDataChart (Real-Time Data)" >
                <local:XamDataChartRealTimeData />
            </TabItem>
            <TabItem Header="RealTimeDisplay">
                <local:RealTimeDisplay />
            </TabItem>
            <TabItem Header="XamDataGrid High Performance">
                <local:XamDataGridHighPerformance />
            </TabItem>
            <TabItem Header="Serial Port">
                <local:SerialPortClass />
            </TabItem>            
        </TabControl>
    </Grid>
</Window>

これは、Infragistics による高性能チャート作成のサンプルからのものです。

タブ付きコントロール項目の 1 つである UserControl は、シリアル ポート接続を管理し、着信データ (バイナリ形式の double のパケットの 100 Hz ストリーム) を処理するクラスです。この UserControl (SerialPort と呼びます) は、別のスレッド (RunWorkerAsync...) に、シリアル ポートの読み取り、バイナリ ストリームの処理、ファイルへのログ記録のタスクを委任します。この永続的に実行されるスレッドは、「SerialPort コントロールがローカルで使用できる」dataRecord 変数 (double[18]) に新しいパケットが保存されるたびに、SerialPort コントロールに非同期でレポートを返します。

他の UserControls は表示コントロールです。1 つは一連のゲージ、もう 1 つはリアルタイム チャートなどです。すべてにデータソース (グラフのデータのコレクションまたはゲージの単一の値) があります。これらのチャート コントロールは、データ バインディング メカニズムを通じてデータ ソースにバインドされます。ここで、受信シリアル データを他の UserControls のデータ ソースに供給して、受信データをリアルタイムで表示する方法が必要です。

少なくとも私が認識していることはありませんが、あるユーザーコントロールから他のユーザーコントロールにデータを交換したり、配布したりするネイティブメカニズムはないようです;-/

私は現在の「サンプル」アプリケーションのコードを持っていますが、かなり長いです。シンプルに保つために、私はそれを省略することにしました。ここで誰かがコード応答を提供することを期待していませんが、ある UserControl から他のユーザーコントロールにデータを配布するという問題に取り組むドキュメントへのポインタを期待しています。 . または、これをどのように行うことができるかについての単なる提案かもしれません。

子にアクセスできるようにメイン ウィンドウ ハンドルにアクセスしようとしましたが、XAML によって生成されたオブジェクトのインスタンスを取得できませんでした。

誰かが提案をしてくれることを願っています..必要に応じて、関連するコードスニペットを喜んで投稿します ありがとう、パオロをよろしく

4

1 に答える 1

1

データを読み取るスレッドは、独自のクラスにカプセル化する必要があります。このクラスのインスタンスを1つ作成し、そのインスタンスをデータにアクセスする必要のあるすべてのユーザーコントロールに渡すよりも。
当然、スレッドが読み取るデータは、現在のSerialPortコントロールではなく、新しいクラスが所有するデータ構造に書き込まれる必要があります。

于 2012-12-10T14:14:48.437 に答える