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" 메세지 박스만 나타나게됩니다.
WPF DrawingBrush 사용하여 화면에 도형 그리기 (0) | 2024.07.25 |
---|---|
WPF 마우스 드래그로 길이 표시하는 사각형 그리기 (0) | 2024.07.25 |
WPF/Prism Event Aggregator (0) | 2024.07.23 |
WPF 패스미니언어를 이용해 이미지를 특정 부분만 보이도록 하기 (0) | 2024.07.23 |
WPF CollectionView 에 필터 적용하기 (0) | 2024.07.20 |