如果属性是从另一个进程更新的,PropertyChanged 不起作用?
Posted
技术标签:
【中文标题】如果属性是从另一个进程更新的,PropertyChanged 不起作用?【英文标题】:PropertyChanged doesn't work if property was updated from another process? 【发布时间】:2021-04-15 23:51:23 【问题描述】:问题是:如果另一个窗口改变位置,我希望我的窗口改变位置。我在另一个线程中运行了一个函数,该函数每 50 毫秒检查另一个窗口位置。如果我直接从另一个进程中更改 myWindow.Left 和 myWindow.Top ,一切正常:
Application.Current.Dispatcher.Invoke((System.Action)delegate
this.Left = newTablePosition.Left + xShift;
this.Top = newTablePosition.Top + yShift;
);
但如果我尝试将 Window.Left 绑定到 X 并将 Window.Top 绑定到 Y,然后从另一个线程更改 X 和 Y,它就不起作用。我已经实现了 INotifyPropertyChanged:
public double X
set
x = value;
OnPropertyChanged(nameof(X));
getreturn x;
private double y;
public double Y
set
y = value;
OnPropertyChanged(nameof(Y));
getreturn y;
但是这段代码不会调用我的窗口移动:
Application.Current.Dispatcher.Invoke((System.Action)delegate
X = newTablePosition.Left + xShift + HUDPosition.x;
Y = newTablePosition.Top + yShift + HUDPosition.y; )
我是这样调用这段代码的:
Thread newthread = new Thread(CheckTablePosition)IsBackground = true;
isActive = true;
newthread.Start();
及功能:
public void
CheckTablePosition()
while (isActive)
Thread.Sleep(50);
var newTablePosition = new TablePosition(_table.hWnd);
if (_tablePosition.IsEqual(newTablePosition))
continue;
_tablePosition = newTablePosition;
var xShift = (int) (newTablePosition.Width * _defaultPosition.x);
var yShift = (int) (newTablePosition.Height * _defaultPosition.y);
try
Application.Current.Dispatcher.Invoke((System.Action)delegate
this.Left = newTablePosition.Left + xShift + HUDPosition.x;
this.Top = newTablePosition.Top + yShift + HUDPosition.y;
OnPropertyChanged(nameof(Y)););
catch(Exception ex)
MessageBox.Show(ex.ToString());
break;
【问题讨论】:
【参考方案1】:它有这么简单的解决方案。我将绑定更改为双向绑定,现在可以使用:
Left="Binding X, Mode=TwoWay"
【讨论】:
以上是关于如果属性是从另一个进程更新的,PropertyChanged 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
如果在另一个进程中编辑 sharedPreferences 将不会更新