Custom Image Toggle Button

The behavior is one kind of Check Box, You need to provide a default image (unchecked image) to visible in Default mode (Unchecked Mode), again you need to provide Checked Image when user will check toggle the button that time it will reflect on UI.

Image

How to create Toggle Image Control?

1. Add New Custom Control in your Project: Right Click on your project → Add → New Item.
2. Select User Control from Add New Item window → Specify any name for control (Toggle Image) and click on Add button.






3.
Now open ToggleImage.Xaml page and add Image control on page.
  1. <Grid>
  2. <Image Name="image"/>
  3. </Grid>
4. Now go to code behind of the control ToggleImage.Xaml.cs copy the following code and paste it.
  1. using System;
  2. using Windows.UI.Xaml;
  3. using Windows.UI.Xaml.Controls;
  4. using Windows.UI.Xaml.Input;
  5. using Windows.UI.Xaml.Media.Imaging;
  6. // The User Control item template is documented at http://go.microsoft.com/fwlink/?LinkId=234236
  7. namespace MyProject.Controls
  8. {
  9. public sealed partial class ToggleImage: UserControl
  10. {
  11. public delegate void CheckedChangeHandler(bool isChecked);
  12. public event CheckedChangeHandler CheckedChange;
  13. private BitmapImage _checkedImage;
  14. private BitmapImage _unCheckedImage;
  15. public ToggleImage()
  16. {
  17. this.InitializeComponent();
  18. this.Tapped += ToggleImage_OnTapped;
  19. this.Loaded += ToggleImage_Loaded;
  20. this.Unloaded += ToggleImage_Unloaded;
  21. }#
  22. region Checked Image Dependency Property
  23. /// <summary>
  24. /// Set image to show on checked.
  25. /// </summary>
  26. public string CheckedImagePath
  27. {
  28. get
  29. {
  30. return (string) GetValue(CheckedImagePathProperty);
  31. }
  32. set
  33. {
  34. SetValue(CheckedImagePathProperty, value);
  35. }
  36. }
  37. /// <summary>
  38. /// Dependency property Register Image.
  39. /// </summary>
  40. public static readonly DependencyProperty CheckedImagePathProperty = DependencyProperty.Register("CheckedImagePath", typeof (string), typeof (ToggleImage), new PropertyMetadata(null));#
  41. endregion Checked Image Dependency Property# region Unchecked Image Dependency Property
  42. /// <summary>
  43. /// Set image to show on unchecked.
  44. /// </summary>
  45. public string UncheckedImagePath
  46. {
  47. get
  48. {
  49. return (string) GetValue(UncheckedImagePathProperty);
  50. }
  51. set
  52. {
  53. SetValue(UncheckedImagePathProperty, value);
  54. }
  55. }
  56. /// <summary>
  57. /// Dependency property Register Image.
  58. /// </summary>
  59. public static readonly DependencyProperty UncheckedImagePathProperty = DependencyProperty.Register("UncheckedImagePath", typeof (string), typeof (ToggleImage), new PropertyMetadata(null));#
  60. endregion Unchecked Image Dependency Property# region IsChecked Dependency Property
  61. /// <summary>
  62. /// Get or Set check/unchecked status.
  63. /// </summary>
  64. public bool IsChecked
  65. {
  66. get
  67. {
  68. return (bool) GetValue(IsCheckedProperty);
  69. }
  70. set
  71. {
  72. SetValue(IsCheckedProperty, value);
  73. }
  74. }
  75. /// <summary>
  76. /// Handles image selection changed.
  77. /// </summary>
  78. public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register("IsChecked", typeof (bool), typeof (ToggleImage), new PropertyMetadata(false, OnCheckedStatusChanged));
  79. /// <summary>
  80. /// Handles checked status change.
  81. /// </summary>
  82. /// <param name="d">
  83. /// The <see cref="DependencyObject"/> on which
  84. /// the property has changed value.
  85. /// </param>
  86. /// <param name="e">
  87. /// Event data that is issued by any event that
  88. /// tracks changes to the effective value of this property.
  89. /// </param>
  90. private static void OnCheckedStatusChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  91. {
  92. var target = (ToggleImage) d;
  93. target.OnCheckedStatusChanged();
  94. }
  95. /// <summary>
  96. /// Handles checked status changed.
  97. /// </summary>
  98. private void OnCheckedStatusChanged()
  99. {
  100. if (_checkedImage != null & _unCheckedImage != null) image.Source = IsChecked ? _checkedImage : _unCheckedImage;
  101. if (CheckedChange != null) CheckedChange.Invoke(IsChecked);
  102. }#
  103. endregion IsChecked Dependency Property# region Private Methods
  104. void ToggleImage_Loaded(object sender, RoutedEventArgs e)
  105. {
  106. if (!string.IsNullOrEmpty(UncheckedImagePath))
  107. {
  108. _unCheckedImage = new BitmapImage(new Uri(UncheckedImagePath, UriKind.RelativeOrAbsolute));
  109. image.Source = _unCheckedImage;
  110. }
  111. if (!string.IsNullOrEmpty(CheckedImagePath)) _checkedImage = new BitmapImage(new Uri(CheckedImagePath, UriKind.RelativeOrAbsolute));
  112. }
  113. void ToggleImage_Unloaded(object sender, RoutedEventArgs e)
  114. {
  115. this.Tapped -= ToggleImage_OnTapped;
  116. this.Loaded -= ToggleImage_Loaded;
  117. this.Unloaded -= ToggleImage_Unloaded;
  118. _checkedImage = null;
  119. _unCheckedImage = null;
  120. image = null;
  121. }
  122. void ToggleImage_OnTapped(object sender, TappedRoutedEventArgs e)
  123. {
  124. IsChecked = !IsChecked;
  125. }#
  126. endregion Private Methods
  127. }
  128. }
5. Now Build your project.
How to Consume ImageControl in your page?
  1. <Page
  2. x:Class="MyProject.Page1"
  3. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  4. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  5. xmlns:control="using:MyProject.Controls"
  6. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  7. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  8. mc:Ignorable="d">
  9. <Grid>
  10. <control:ToggleImage Width="40" VerticalAlignment="Top" UncheckedImagePath="ms-appx:///Assets/UncheckedImage.png" CheckedImagePath="ms-appx:///Assets/CheckedImage.png"/>
  11. </Grid>
  12. </Page>