private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
        {
            if (_viewModel != null)
            {
                _viewModel.Keys.CollectionChanged -= OnKeysCollectionChanged;
                _viewModel = null;
                OnKeysCollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
            }

            if (DataContext is OnScreenKeyboardRowViewModel)
            {
                _viewModel = DataContext as OnScreenKeyboardRowViewModel;
                _viewModel.Keys.CollectionChanged += OnKeysCollectionChanged;
                OnKeysCollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
            }
        }
 private OnScreenKeyboardRowViewModel BuildRow5(KeyboardLayout layout)
 {
     var row = new OnScreenKeyboardRowViewModel();
     row.Keys.Add(KeyForScanCode(0x1D, layout));             // right control
     row.Keys.Add(KeyForScanCode(0x5B, layout, isE0: true)); // left windows
     row.Keys.Add(KeyForScanCode(0x38, layout));             // left alt
     row.Keys.Add(KeyForScanCode(0x39, layout, 45));         // space bar
     row.Keys.Add(KeyForScanCode(0x38, layout, isE0: true)); // right alt
     row.Keys.Add(KeyForScanCode(0x5C, layout, isE0: true)); // right windows
     row.Keys.Add(KeyForScanCode(0x5D, layout, isE0: true)); // menu
     row.Keys.Add(KeyForScanCode(0x1D, layout, isE0: true)); // right control
     return row;
 }
 private OnScreenKeyboardRowViewModel BuildRow4(KeyboardLayout layout)
 {
     var row = new OnScreenKeyboardRowViewModel();
     row.Keys.Add(KeyForScanCode(0x2A, layout, 21));         // left shift
     row.Keys.Add(KeyForScanCode(0x2C, layout));             // Z
     row.Keys.Add(KeyForScanCode(0x2D, layout));             // X
     row.Keys.Add(KeyForScanCode(0x2E, layout));             // C
     row.Keys.Add(KeyForScanCode(0x2F, layout));             // V
     row.Keys.Add(KeyForScanCode(0x30, layout));             // B
     row.Keys.Add(KeyForScanCode(0x31, layout));             // N
     row.Keys.Add(KeyForScanCode(0x32, layout));             // M
     row.Keys.Add(KeyForScanCode(0x33, layout));             // ,
     row.Keys.Add(KeyForScanCode(0x34, layout));             // .
     row.Keys.Add(KeyForScanCode(0x35, layout));             // /
     row.Keys.Add(KeyForScanCode(0x36, layout, 21));         // right shift
     return row;
 }
 private OnScreenKeyboardRowViewModel BuildRow3(KeyboardLayout layout)
 {
     var row = new OnScreenKeyboardRowViewModel();
     row.Keys.Add(KeyForScanCode(0x3A, layout, 17));         // caps lock
     row.Keys.Add(KeyForScanCode(0x1E, layout));             // A
     row.Keys.Add(KeyForScanCode(0x1F, layout));             // S
     row.Keys.Add(KeyForScanCode(0x20, layout));             // D
     row.Keys.Add(KeyForScanCode(0x21, layout));             // F
     row.Keys.Add(KeyForScanCode(0x22, layout));             // G
     row.Keys.Add(KeyForScanCode(0x23, layout));             // H
     row.Keys.Add(KeyForScanCode(0x24, layout));             // J
     row.Keys.Add(KeyForScanCode(0x25, layout));             // K
     row.Keys.Add(KeyForScanCode(0x26, layout));             // L
     row.Keys.Add(KeyForScanCode(0x27, layout));             // ;
     row.Keys.Add(KeyForScanCode(0x28, layout));             // '
     row.Keys.Add(KeyForScanCode(0x1C, layout, 21));         // enter
     return row;
 }
 private OnScreenKeyboardRowViewModel BuildRow2(KeyboardLayout layout)
 {
     var row = new OnScreenKeyboardRowViewModel();
     row.Keys.Add(KeyForScanCode(0x0F, layout, 15));         // tab
     row.Keys.Add(KeyForScanCode(0x10, layout));             // Q
     row.Keys.Add(KeyForScanCode(0x11, layout));             // W
     row.Keys.Add(KeyForScanCode(0x12, layout));             // E
     row.Keys.Add(KeyForScanCode(0x13, layout));             // R
     row.Keys.Add(KeyForScanCode(0x14, layout));             // T
     row.Keys.Add(KeyForScanCode(0x15, layout));             // Y
     row.Keys.Add(KeyForScanCode(0x16, layout));             // U
     row.Keys.Add(KeyForScanCode(0x17, layout));             // I
     row.Keys.Add(KeyForScanCode(0x18, layout));             // O
     row.Keys.Add(KeyForScanCode(0x19, layout));             // P
     row.Keys.Add(KeyForScanCode(0x1A, layout));             // [
     row.Keys.Add(KeyForScanCode(0x1B, layout));             // ]
     row.Keys.Add(KeyForScanCode(0x2B, layout, 15));         // \
     return row;
 }
 private OnScreenKeyboardRowViewModel BuildRow1(KeyboardLayout layout)
 {
     var row = new OnScreenKeyboardRowViewModel();
     row.Keys.Add(KeyForScanCode(0x29, layout));             // ~
     row.Keys.Add(KeyForScanCode(0x02, layout));             // 1
     row.Keys.Add(KeyForScanCode(0x03, layout));             // 2
     row.Keys.Add(KeyForScanCode(0x04, layout));             // 3
     row.Keys.Add(KeyForScanCode(0x05, layout));             // 4
     row.Keys.Add(KeyForScanCode(0x06, layout));             // 5
     row.Keys.Add(KeyForScanCode(0x07, layout));             // 6
     row.Keys.Add(KeyForScanCode(0x08, layout));             // 7
     row.Keys.Add(KeyForScanCode(0x09, layout));             // 8
     row.Keys.Add(KeyForScanCode(0x0A, layout));             // 9
     row.Keys.Add(KeyForScanCode(0x0B, layout));             // 0
     row.Keys.Add(KeyForScanCode(0x0C, layout));             // -
     row.Keys.Add(KeyForScanCode(0x0D, layout));             // +
     row.Keys.Add(KeyForScanCode(0x0E, layout, 20));         // backspace
     return row;
 }