Как правильно изменить изображение кнопки, которую я только что нажал? - PullRequest
0 голосов
/ 08 декабря 2011

Вот моя дилемма. У меня есть набор из 10 кнопок, которые я использую, чтобы оценить что-то. У них есть изображение звезды, которое при нажатии меняется с серого на красное. Если я нажму звезду 5, все предыдущие также будут заменены на красный.

Моя проблема в том, что нажатая звезда не меняет своего изображения, поэтому я нашел обходной путь, чтобы ввести паузу внутри блока диспетчера. Я не вижу это очень элегантно, но это работает, и мне было интересно, есть ли у кого-то лучший подход.

Даже если никто не найдет лучшего способа, по крайней мере, этот код поможет другим людям делать что-то с несколькими кнопками, которые делают почти то же самое, или просматривать элементы управления на панели.

Вот код события клика:

private void btnStar_Click(object sender, RoutedEventArgs e)
    {
        //First we get the number of the star from the control name
        String strNum = (sender as Button).Name;
        strNum = strNum.Replace("btnStar", "");
        int idxSelected = int.Parse(strNum);

        Debug.WriteLine("Selected star #" + strNum);

        //We store the image ON an OFF to be used later
        ImageBrush imgbrON = new ImageBrush();
        imgbrON.ImageSource = new BitmapImage(new Uri("images/estrella_on.png", UriKind.Relative));
        imgbrON.Stretch = Stretch.None;

        ImageBrush imgbrOFF = new ImageBrush();
        imgbrOFF.ImageSource = new BitmapImage(new Uri("images/estrella_off.png", UriKind.Relative));
        imgbrOFF.Stretch = Stretch.None;

        //If we pressed the first star when only the first was selected we reset all
        if (idxSelected == 1 && iCurrentNumberOfStars == 1)
        {
            idxSelected = 0; //In order to deselect all stars
            Debug.WriteLine("Deselect all");
        }
        else
        {
            //Here is the code to do the WORKAROUND to select the clicked star
            Dispatcher.BeginInvoke(() =>
           {
               Thread.Sleep(500);
               (sender as Button).Background = imgbrON;
           });
        }

        iCurrentNumberOfStars = idxSelected;


        foreach (UIElement child in ContentPanel.Children)
        {
            Thread.Sleep(10);
            if (child.GetType().Name == "Button")
            {
                Button tmpButton = (child as Button);
                Image content = tmpButton.Content as Image;

                strNum = tmpButton.Name;
                if (strNum.StartsWith("btnStar") == true)
                {
                    strNum = strNum.Replace("btnStar", "");
                    int idxtmp = int.Parse(strNum);

                    if (idxtmp > idxSelected )
                    {                       
                        Debug.WriteLine(tmpButton.Name + ":OFF");
                        tmpButton.Background = imgbrOFF;
                    }
                    else
                    {                            
                        Debug.WriteLine(tmpButton.Name +":ON");
                        tmpButton.Background = imgbrON;
                    }
                }
            }

        }
    }
}

1 Ответ

0 голосов
/ 08 декабря 2011

Причина, по которой это происходит - кнопка имеет визуальные состояния, которые управляют свойством фона. Когда вы пытаетесь установить собственный фон - анимация отменяет ваши изменения. Если убрать фоновую анимацию из визуальных состояний - она ​​будет работать без задержки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...