Skip to content
11 Januari 2011 / Jeffrey Hermanto Halimsetiawan

Switch UserControl pada Windows Presentation Foundation


Pada pembangunan aplikasi dengan menggunakan Windows MultiPoint Mouse SDK, developer hanya dimungkinkan untuk menggunakan sebuah Window yang dapat dikenai multipoint event. Oleh karena itu, beberapa kelas UserControl digunakan untuk mengimplementasikan rancangan antarmuka aplikasi. Agar perpindahan antar UserControl berjalan smooth, hal tersebut dapat dilakukan dengan mengimplementasikan beberapa pattern, yaitu: mediator, state, dan singleton. Berikut adalah langkah-langkahnya:

  1. Pilih menu bar File – New – Project
  2. Pilih Windows MultiPoint Mouse SDK pada Project types dan Multipoint Application template projectimage
  3. Tambahkan kelas HostManager pada project yang berperan sebagai mediator dari seluruh UserControl yang ada. image
  4. Tambahkan kelas BaseHost pada project yang merupakan turunan dari kelas UserControl dan induk dari semua UserControl yang akan dibuat. Kelas BaseHost dan turunannya merupakan penerapan dari pattern state.image
  5. Implementasikan kelas HostManager yang telah ditambahkan menjadi turunan dari kelas Grid dan memiliki asosiasi ke kelas BaseHost.
  6. /// <summary>
    /// Kelas yang berperan sebagai mediator
    /// Author: Jeffrey Hermanto Halimsetiawan
    /// </summary>
    public class HostManager : Grid
    {
        /// <summary>
        /// Current Host
        /// </summary>
        private BaseHost _currentHost;
    
        public HostManager()
        {
            
        }
    
        /// <summary>
        /// Changes the host.
        /// </summary>
        /// <param name="newHost">The new host.</param>
        public void ChangeHost(BaseHost newHost)
        {
            Children.Remove(_currentHost);
            _currentHost = newHost;
            Children.Add(_currentHost);
        }
    
        /// <summary>
        /// Exits the application.
        /// </summary>
        public void ExitApplication()
        {
            Application.Current.Shutdown();
        }
    }
  7. Implementasikan kelas BaseHost yang memiliki asosiasi yang merupakan turunan dari UserControl dan memiliki asosiasi ke HostManager. Sebenarnya, BaseHost merupakan kelas abstrak yang tidak dapat diinstansiasi tetapi BaseHost tidak dijadikan kelas abstrak agar kelas turunan dari BaseHost dapat menampilkan Designer View.
  8. /// <summary>
    /// Author: Jeffrey Hermanto Halimsetiawan
    /// </summary>
    public class BaseHost : UserControl
    {
        private HostManager _owner;
    
        public BaseHost()
        {
    
        }
    
        public BaseHost(HostManager owner)
        {
            _owner = owner;
        }
    
        /// <summary>
        /// Gets or sets the owner.
        /// </summary>
        /// <value>The owner.</value>
        protected HostManager Owner
        {
            get { return _owner; }
            set { _owner = value; }
        }
    }
  9. Tambahkan sebuah kelas MenuHost yang merupakan turunan dari BaseHost dan memiliki sebuah MultipointButton dengan XAML sebagai berikut:
  10. <ucs:BaseHost x:Class="UserControlSwitcher.MenuHost"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ucs="clr-namespace:UserControlSwitcher"
        xmlns:mp="clr-namespace:Microsoft.Multipoint.Sdk.Controls;assembly=Microsoft.Multipoint.Sdk.Controls"
        Height="300" Width="300">
        <Grid>
            <mp:MultipointButton Height="53" VerticalAlignment="Top" Margin="51,45,56,0" Name="mpbClick">
                Click
            </mp:MultipointButton>
        </Grid>
    </ucs:BaseHost>
    
  11. Implementasikan pattern singleton pada kelas yang merupakan turunan dari BaseHost, yaitu: MenuHost karena pergantian UserControl yang sama saat aplikasi berjalan biasanya dilakukan berulang kali sehingga penerapan pattern singleton dapat mencegah memory leak.
  12. /// <summary>
    /// Author: Jeffrey Hermanto Halimsetiawan
    /// </summary>
    public partial class MenuHost : BaseHost
    {
        private static MenuHost _instance;
    
        public MenuHost(HostManager owner)
            : base(owner)
        {
            InitializeComponent();
        }
    
        /// <summary>
        /// Gets the instance.
        /// </summary>
        /// <param name="owner">The owner.</param>
        /// <returns></returns>
        public static MenuHost GetInstance(HostManager owner)
        {
            if (_instance == null)
            {
                _instance = new MenuHost(owner);
            }
            return _instance;
        }
    }
  13. Implementasikan constructor pada kelas HostManager agar melakukan pergantian ke MenuHost.
  14. public HostManager()
    {
        ChangeHost(MenuHost.GetInstance(this));
    }
  15. Tambahkan asosiasi ke HostManager pada kelas MultipointWindow.
  16. // <summary>
    /// Interaction logic for MultiPointWindow.xaml
    /// Author: Jeffrey Hermanto Halimsetiawan
    /// </summary>
    public partial class MultipointWindow : System.Windows.Window
    {
        private HostManager _manager;
    
        /// <summary>
        /// This window template uses MultiPoint SDK to support
        /// multiple mice. Please refer SDK documentation to support 
        /// multiple instances of other devices. 
        /// </summary>
        public MultipointWindow()
        {
            InitializeComponent();
            _manager = new HostManager();
            Content = _manager;
            // Add handler to window loaded event where all multipoint 
            // initialization will happen
            this.Loaded += new RoutedEventHandler(MultipointWindow_Loaded);
        }
    
        /// <summary>
        /// This is event handler for window "Loaded" Event. 
        /// All MultiPoint initialization should happen on this event.
        /// </summary>
        void MultipointWindow_Loaded(object sender, RoutedEventArgs e)
        {
            // initialize the MulitPoint system
            MultipointSdk.Instance.Register(this);
        }
    }
  17. Jika ingin menambahkan kelas UserControl yang lain, maka cukup mengulangi langkah 7 dan 8.

Berikut adalah kelas diagram yang menunjukkan hubungan antar kelas pada project yang telah dibuat:image

Berikut adalah hasil program ketika dijalankan:image

Semoga bermanfaat😀

  1. sepatu bandung / Jan 11 2011 12:52

    mantep, makasih ilmunya, salam hangat.

    • Jeffrey Hermanto / Jan 13 2011 17:08

      sama-sama semoga bermanfaat😀

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: