EventAggregator 는 이벤트들을 구독하거나 구독기능을 제공하며
컴포넌트 간의 이벤트 처리를 직접적인 참조 없이 가능하게 해줍니다.
MainWindow.xaml
<Window x:Class="WpfAppPrism.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <StackPanel VerticalAlignment="Center"> <Button Name="testButton" Content="Click!" Height="100" Width="200" HorizontalAlignment="Center" Click="testButton_Click"/> <Label Content=""/> <Button Name="unsubscribeButton" Content="Unsubscribe" Height="100" Width="200" HorizontalAlignment="Center" Click="unsubscribeButton_Click"/> </StackPanel> </Window>
|
MainWindow.xaml.cs
using Microsoft.Practices.Composite.Events; using Microsoft.Practices.Composite.Presentation.Events;
using System.Windows;
namespace WpfAppPrism { /// <summary> /// string 을 인자를 가지는 이벤트 입니다. /// CompositePresentationEvent 는 이벤트 게시 및 구독을 관리하는 클래스입니다. /// </summary> public class SampleStringEvent : CompositePresentationEvent<string> { }
public partial class MainWindow : Window { /// <summary> /// EventAggregator 입니다. /// </summary> EventAggregator aggregator = new EventAggregator();
/// <summary> /// 구독 토큰입니다. /// </summary> private SubscriptionToken subscriptionToken;
public MainWindow() { InitializeComponent();
// 이벤트를 구독합니다. this.aggregator.GetEvent<SampleStringEvent>().Subscribe(StringAction1);
//이벤트를 구독하고 구독취소를 위해 SubscriptionToken 을 받습니다. this.subscriptionToken = this.aggregator.GetEvent<SampleStringEvent>().Subscribe(StringAction2); }
/// <summary> /// 이벤트 1 입니다. /// </summary> /// <param name="s"></param> private void StringAction1(string s) { MessageBox.Show($"{s}.StringAction1"); }
/// <summary> /// 이벤트 2 입니다. /// </summary> /// <param name="s"></param> private void StringAction2(string s) { MessageBox.Show($"{s}.StringAction2"); }
/// <summary> /// test 버튼 클릭 이벤트입니다. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void testButton_Click(object sender, RoutedEventArgs e) { // Subscribe 된 이벤트를 실행합니다. this.aggregator.GetEvent<SampleStringEvent>().Publish("testButton"); }
/// <summary> /// Unsubscribe 버튼 클릭 이벤트입니다. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void unsubscribeButton_Click(object sender, RoutedEventArgs e) { // 이벤트 하나를 Unsubscribe 합니다. this.aggregator.GetEvent<SampleStringEvent>().Unsubscribe(this.subscriptionToken); } } }
|
우선 Click! 버튼을 클릭하면 "testButton.StringAction2" 메세지 박스가 나온후 "testButton.StringAction1" 메세지 박스가 나타난다.
구독한 순서 역순으로 이벤트는 발생된다.
여기서 Unsubscribe 버튼을 클릭하면 "testButton.StringAction1" 메세지 박스만 나타난다.
'C# > WPF' 카테고리의 다른 글
[WPF] DrawingBrush 사용하여 화면에 도형 그리기 (0) | 2020.07.19 |
---|---|
[WPF] 마우스 드래그로 사각형 그리기 (0) | 2020.07.14 |
[WPF/Prism] Event Aggregator (0) | 2020.07.13 |
[WPF] 패스미니언어를 이용해 이미지를 특정 부분만 보이도록 하기 (0) | 2020.07.13 |
[WPF] CollectionView 에 필터 적용하기 (0) | 2020.07.12 |