NBoymanns
NBoymanns

Reputation: 716

Image inside ListBox.ItemTemplate how to change opacity on tap

I have created the following Listbox.Itemtemplate:

<ListBox.ItemTemplate>
   <DataTemplate>
      <Image Name="ChannelImage" Source="{Binding ImageUrl}" Width="56" Height="56" Margin="0,0,28,0" Tap="ChannelImage_Tap" Opacity="0.5"/>
   </DataTemplate>
</ListBox.ItemTemplate>

By default the image inside the ItemTemplate should have opacity 0.5, now I want to "Highlight" (set opacity to 1.0) the image when the user taps the image. I made this with the following code (Tap="ChannelImage_Tap"):

private void ChannelImage_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
    ((Image)sender).Opacity = 1.0;
}

But I don't know how to set the image back to opacity 0.5 when the user taps another image.

Upvotes: 1

Views: 475

Answers (1)

Jaihind
Jaihind

Reputation: 2778

Do the following code in ListBox selection_change event instead image_tap

//I assume your listbox selection changed is ListBoxImage_Selectionchange
//ListBoxImage is your ListBox name
// LastSelectedIndex define globally
int LastSelectedIndex =0;

private void  ListBoxImage_Selectionchange(object sender, SelectionChangedEventArgs e)
    {
          if (ListBoxImage.SelectedIndex == -1)
                    return;
       if(LastSelectedIndex>0)
         {
            ListBoxItem lastItem =this.ListImage.ItemContainerGenerator.ContainerFromIndex(LastSelectedIndex) as ListBoxItem;
           Image lastImage = FindFirstElementInVisualTree<Image>(lastItem);
           lastImage.Opacity = 0.5;
         }

          ListBoxItem selectedItem = this.ListImage.ItemContainerGenerator.ContainerFromIndex(ListImage.SelectedIndex) as ListBoxItem;
          Image selectedImage = FindFirstElementInVisualTree<Image>(selectedItem);
          selectedImage.Opacity = 1.0; 
          LastSelectedIndex = ListBoxImage.SelectedIndex;
          ListImage.SelectedIndex = -1;
    }

    private T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject
            {
                var count = VisualTreeHelper.GetChildrenCount(parentElement);
                if (count == 0)
                    return null;

                for (int i = 0; i < count; i++)
                {
                    var child = VisualTreeHelper.GetChild(parentElement, i);

                    if (child != null && child is T)
                    {
                        return (T)child;
                    }
                    else
                    {
                        var result = FindFirstElementInVisualTree<T>(child);
                        if (result != null)
                            return result;

                    }
                }
                return null;
            }

Upvotes: 1

Related Questions