Singleton 클래스가 커서 좌표를 읽고이를 사용하는 Observer 클래스를 레이블에 게시하는 WPF 응용 프로그램을 작성했습니다.WPF, EventAggregator 대신 커서 읽기 위치 커서 위치
좌표를 읽기위한 싱글 톤 클래스에서 이제 타이머를 사용하고 있습니다. MouseMoveEvent를 사용하는 EventAggregator에 의해 그를 대체하고 싶습니다. 튜토리얼을 많이 읽었지만 EventAggregator가 작동하는 방식과 내 앱에 맞는 방식을 이해하지 못합니다. 아무도 내 예제에서 설명 할 수 있을까?
싱글 :
public class MousePointProvider
{
[DllImport("user32.dll")]
static extern bool GetCursorPos(ref System.Drawing.Point lpPoint);
private List<IObserver> _observerList;
private DispatcherTimer _timer;
private static MousePointProvider _instance = null;
public static MousePointProvider Instance
{
get
{
if (_instance == null)
{
_instance = new MousePointProvider();
}
return _instance;
}
}
private Point _currentMousePosition;
public Point CurrentMousePosition
{
get { return _currentMousePosition; }
}
private MousePointProvider()
{
_observerList = new List<IObserver>();
_timer = new DispatcherTimer();
_timer.Interval = TimeSpan.FromMilliseconds(1);
_timer.Tick += (s, e) =>
{
MousePositionChanged();
};
_timer.Start();
}
public void RegisterObserver(IObserver observer)
{
if (!_observerList.Contains(observer))
{
_observerList.Add(observer);
}
}
public void UnregisterObserver(IObserver observer)
{
_observerList.Remove(observer);
}
public void MousePositionChanged()
{
GetCursorPos(ref _currentMousePosition);
for (int i = 0; i < _observerList.Count; i++)
{
_observerList[i].MouseChanged(_currentMousePosition.X, _currentMousePosition.Y);
}
}
}
관찰자 : 사전에
public class Listener : Canvas, IObserver
{
System.Windows.Controls.Label labelX = new System.Windows.Controls.Label();
System.Windows.Controls.Label labelY = new System.Windows.Controls.Label();
public Listener()
{
MousePointProvider.Instance.RegisterObserver(this);
this.Children.Add(labelX);
Canvas.SetLeft(labelX, 100);
Canvas.SetTop(labelX, 100);
this.Children.Add(labelY);
Canvas.SetLeft(labelY, 100);
Canvas.SetTop(labelY, 200);
}
public void MouseChanged(int x, int y)
{
labelX.Content = "X=" + x.ToString();
labelY.Content = "Y=" + y.ToString();
}
}
덕분에 여기에 코드입니다.