Вы можете попытаться запустить дочерний процесс в новом потоке и вызвать process.WaitForExit()
после его запуска. Затем, после закрытия дочернего процесса, вы можете сфокусировать свое приложение, используя Dispatcher
, поскольку текущий поток не является потоком пользовательского интерфейса.
var process = Process.Start(@"C:\Windows\system32\mspaint.exe");
process.WaitForExit();
Dispatcher.Invoke(() => MainWindow.Current.MakeFocus()); // sample line
Ваше главное окно должно иметь статическое свойство Current
, и оно должно быть установлено при запуске вашего основного приложения.
Вот проблема:
[сам willChangeValueForKey:keyPath]; <---В данный момент фактический наблюдатель должен отказаться от подписки на улицу [сам didChangeValueForKey:keyPath]; <---и добавляют себя к новому значению.
Не обеспечивая новое значение Вы отклоняете наблюдателя возможность отказаться от подписки.
Вот взломанная версия, которая работает и демонстрирует проблему.
/* --- Bridge ----------------------------------------- */
....
.....
@interface Bridge : NSObject {
NSMutableDictionary* observedKeys;
NSObject* obj;
//**** Dictionary for old values just before we send the didChangeValue notification.
NSMutableDictionary * oldValues;
}
...
.....
- (id)init {
if( !( self = [super init] ) ) { return nil; }
observedKeys = [NSMutableDictionary new];
//************* Initialize the new dictionary
oldValues = [NSMutableDictionary new];
return self;
}
....
.....
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog( @">>>> Detected Change in keyPath: %@", keyPath );
// **** Cache the old value before telling everyone its going to change.
[oldValues setValue:[change valueForKey:NSKeyValueChangeOldKey] forKey:keyPath];
[self willChangeValueForKey:keyPath];
// **** Simulate the change by removing the old value.
[oldValues removeObjectForKey:keyPath];
// **** Now when we say we did change the value, we are not lying.
[self didChangeValueForKey:keyPath];
}
-(id)valueForUndefinedKey:(NSString*)key {
// **** Important part, return oldvalue if it exists
id oldValue;
if(oldValue = [oldValues valueForKey:key]){
return oldValue;
}
/* Register an observer for the key, if not already done */
if( ![observedKeys objectForKey:key] ) {
[observedKeys setObject:[NSNumber numberWithBool:YES] forKey:key];
NSLog(@"adding observer for:%@", key);
[obj addObserver:self forKeyPath:key options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
}
return [obj valueForKey:key];
}
....
......