2017-04-18 30 views
1

外部MIDIキーボードからのNoteOnおよびNoteOff MIDIイベントに応答するWPFのピアノキーボード用のXAMLコントロールを作成しようとしています。 Tom Lokovicのmidi-dot-netを使用して、ハードウェアによってトリガーされたNoteOnイベントとNoteOffイベントを発生させていますが、これらのイベントを取得してXAML KeyクラスのNoteOnイベントとNoteOffイベントを発生させる方法が必要です。ピアノ・キーボード・コントロールのユーザーがキーが押された音を再生できるように、オンのときにキーの色が変わり、イベントが登録される必要があります。XAMLでコントロールのイベントを発生させる

すべてのMidi.InputDeviceをキーボード上のすべての単一のキーに渡すことで、各InputDeviceのNoteOnイベントとNoteOffイベントをサブスクライブすることができます。次に、それぞれのNoteOnイベントとNoteOffイベントを発生させますが、問題これは、PianoKeyboardコントロール(Keysを保持するItemsControl)とそのネストされたKeyコントロールがすべて、midi-dot-netの実装と緊密に結合していることです。私がこれをやらなければならない場合、WPFでこれを行うより良い方法がコールスタックのmidi-dot-net higherへの依存を動かすべきであるように思えました。

私はここに完全に貼り付けるのにあまりにも多くのコードを持っていますが、読めるようになっています。私はPianoKeyboardのItemTemplateとして使用しているDataTemplateのサンプルをここに示します。

<DataTemplate x:Key="naturalKeyTemplate"> <!--NOTE: Background and Foreground Color assignment and changing is accounted for in the style.--> <local:Key Grid.Column="{Binding Converter={StaticResource keyToColumnNumberConverter}}" Grid.ColumnSpan="{Binding Converter={StaticResource keyToColumnSpanConverter}}" Grid.RowSpan="2" Style="{StaticResource naturalKeyStyle}" Note="{Binding Note}" IsHighlighted="{Binding IsHighlighted}"> <!--TODO: Find a way of raising the Key's NoteOn and NoteOff events from here.--> </local:Key> </DataTemplate>

基本的に私は何をされて求めている:行動に建てられたボタンの(例えばマウスクリック)、1が得るんどのようにそれがトリガーするとWPFのボタンをトリガするためにサポートされていない入力デバイスを与えられましたボタンの派生クラスに結合しないで

答えて

1

あなたは、プログラムClickイベントを発生させることができます:

button1.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent)); 
+0

私はPianoKeyboardコントロールのDataContextを自分自身に設定する必要がないように、コードビハインドにロジックを置かないようにしようとしています(現在は他の理由でも排除しようとしていますが) 。もし私がコードのバインディングに依存しているのであれば、データコンテキストを何かに設定するためのコントロールのユーザが必要です。 – Sphynx

+0

このコードはビューのコードビハインドには入りません。カスタムコントロールクラスに入ります。 – mm8

+0

PianoKeyboardコントロールクラス? – Sphynx

0

を、私はこれはと呼ばれるイベントに基づいて特定のMetodを呼び出すためにあなたを助けることができると思います。

<local:Key> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="Mouse.PreviewMouseDown"> 
       <ei:CallMethodAction MethodName="NoteOn" 
            TargetObject="{Binding}" /> 
      </i:EventTrigger> 
      <i:EventTrigger EventName="Mouse.PreviewMouseUp"> 
       <ei:CallMethodAction MethodName="NoteOff" 
            TargetObject="{Binding}" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </local:Key> 

あなたはのxmlns拡張子を追加する必要があります。

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
+0

これは私が後にしているものだと思う。 NoteOnがBindingオブジェクトのメソッドになり、呼び出されると、私のKeyコントロールでMouse.PreviewMouseDownが発生すると思います。 – Sphynx

+0

実際には、そのoposite、Mouse.PreviewMouseDownはメソッドNoteOnを呼び出します。 –

+0

ああハングアップ、それは逆の方法です!私が使用しているMIDIライブラリのNoteOnイベントとNoteOffイベントによってKey(またはMouseUpとMouseDownではなく)が呼び出されるようにNoteOnイベントとNoteOffイベントが必要です。 – Sphynx

0

私はバインドさのviewmodelを公開更新キーボードの状態リポジトリ、すべてのMIDIイベントに耳を傾けたMIDI listennerサービスシングルトンを行っているでしょうあなたのキーボードコントロールに...しかし、私は実際にあなたのprogramm構造を見ていないので、それは簡単に言うことはできません。あなたはmidi.netでGUIをリンクするため、LOBの道であるように思われませんmidi.netラッパーへのあなたのXAMLでMIDIイベントを結合

...

方法によっては、オン/オフ、十分ではありません、あなたはキーが押された状態として "プレス"が必要ですか?

+0

が押された状態になりますが、私はButtonBase上IsPressedプロパティは読み取り専用ですので、残念ながら、私はボタンをトリガするためにそれを使用することはできません気づきました。 – Sphynx

+0

MIDI NoteOnとNoteOffイベントに関して、私の質問は、ハードウェアから来たMouseイベントでMicrosoftがどうやってそれをするのだろうか?彼らはシングルトンを使うだろうか?私は、シングルトンはグローバルな状態を導入するので、悪い習慣であると思いました。 – Sphynx

+0

あなたのキーボードがmvvmにバインドされている場合は、isPressedが機能します...私はそれを正しく捕まえませんか?あなたはイベントを発射したい、またはmidi.netからそのイベントを取得したいですか? – GCamel

関連する問題