Revision: 48741
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at July 8, 2011 14:27 by PerryBirch
Initial Code
// Class private var
private ISubject<KeyboardState> _KeyboardStates;
// Setup in ctor
_KeyboardStates = new ReplaySubject<KeyboardState>();
// In the update event
_KeyboardStates.OnNext(Keyboard.GetState());
// Func to compare key states (there is probably a better solution for this)
public static Func<KeyboardState, string> KeyStateComparer
{
get
{
return (ks) =>
{
var sb = new StringBuilder();
ks.GetPressedKeys().ToList().ForEach((key) => sb.Append(key.ToString()));
return sb.ToString();
};
}
}
// Extension method to make it easy to append this overload of distinct
public static IObservable<KeyboardState> DistinctUntilChanged(this IObservable<KeyboardState> target)
{
return target.DistinctUntilChanged(KeyStateComparer);
}
// Now that the update event is feeding the _KeyboardStates Observable we can...
var keyPressed = from ks in _KeyboardStates.DistinctUntilChanged()
select ks;
var keyDowns = from ks in keyPressed
.Zip(keyPressed.Skip(1), (prev, cur) =>
{
return from k in cur.GetPressedKeys()
where !prev.GetPressedKeys().Contains(k)
select k;
})
select ks;
var keyUps = from ks in keyPressed
.Zip(keyPressed.Skip(1), (prev, cur) =>
{
return from k in prev.GetPressedKeys()
where !cur.GetPressedKeys().Contains(k)
select k;
})
select ks;
// And with those observables we can...
keyPressed.Subscribe((keys) =>
{
if (keys.GetPressedKeys().Length > 0)
{
var sb = new StringBuilder();
keys.GetPressedKeys().ToList().ForEach((key) => sb.Append(key.ToString()));
Debug.WriteLine("Keys: " + sb.ToString());
}
});
keyDowns.Subscribe((keys) =>
{
foreach (var key in keys)
{
Debug.WriteLine("Key down: " + key);
}
});
keyUps.Subscribe((keys) =>
{
foreach (var key in keys)
{
Debug.WriteLine("Key up: " + key);
}
});
Initial URL
Initial Description
Toying around with Rx in WP7, thought this was interesting...
Initial Title
Rx Keyboard Events in WP7
Initial Tags
Initial Language
C#