Мне нужно немного помочь с моей логикой здесь. Как я могу выбрать картинку выбрать изменить изображение при клике? - PullRequest
0 голосов
/ 18 декабря 2009

Вот что у меня есть:

private void HeroMouseEnter(object sender, MouseEventArgs e)
    {            
        //I did things this was because it is easier to maintain code in a sense that is is a generic
        //method made for all of the heroes images.
        ((Image)sender).Source = GetGlowingImage(((Image)sender).Name);            
    }

    private void HeroMouseLeave(object sender, MouseEventArgs e)
    {
        //I did this IF conditional because I want to ask, "If the sender object
        //is the hero selected, then do NOT change the image to normal.
        if (SelectedHero != ((Image)sender).Name)
        {
            //I did things this was because it is easier to maintain code in a sense that is is a generic
            //method made for all of the heroes images.
            ((Image)sender).Source = GetNormalImage(((Image)sender).Name);                             
        }            
    }

    private void HeroMouseClick(object sender, MouseEventArgs e)
    {
        if (!HasSelectedAHeroBefore)
        {
            HasSelectedAHeroBefore = true;
            //Created a generic way to play the announcers voice according to where a user clicked.
            string soundfile = "AnnouncerVoice/" + ((Image)sender).Name + ".mp3";
            soundPlayer.Open(new Uri(soundfile, UriKind.Relative));
            soundPlayer.Play();

            //I call the MouseEnter event in order to have the clicked picture glow and set the Selected bool to true 
            //to keep it highlighted.
            SelectedHero = ((Image)sender).Name; 
        }
        else if (HasSelectedAHeroBefore)
        {
            //Created a generic way to play the announcers voice according to where a user clicked.
            string soundfile = "AnnouncerVoice/" + ((Image)sender).Name + ".mp3";
            soundPlayer.Open(new Uri(soundfile, UriKind.Relative));
            soundPlayer.Play();

            //I call the MouseEnter event in order to have the clicked picture glow and set the Selected bool to true 
            //to keep it highlighted.
            SelectedHero = ((Image)sender).Name;
            PreviousSelectedHero = ((Image)sender).Name;
        }

    }

Cliffnotes того, что я хочу. Когда пользователь наводит указатель мыши на мои картинки, я хочу, чтобы картинки светились. Я достигаю этого, меняя изображение на фотошоп (с жаром) на MouseEnter. На MouseLeave я переключаю изображение обратно на нормальное.

Когда пользователь щелкает, я хочу, чтобы изображение, на которое нажали, осталось с тем, что я сделал. Все время, когда пользователь перемещает свою мышь, я все еще хочу, чтобы они светились на MouseEnter и гасли на MouseLeave.

Наконец, если пользователь щелкает изображение, отличное от выбранного, щелкнутое изображение должно оставаться выделенным (светящимся), как и ранее.

Я так озадачен и уверен, что это легко исправить, я просто немного заржавел.

Огромное спасибо за помощь. : D

Редактировать: Аплогиз, я забыл упомянуть, что не работает. ВСЕ слова точно соответствуют тому, как я хочу, однако, когда я нажимаю на другое изображение, предыдущее остается светящимся (как выбранное), пока я не наведу на него мышь и не оставлю ее.

Edit2: я добавил что-то, что может работать. Но я не знаю, как выбрать элемент управления изображения по его имени. Любая помощь?

else if (HasSelectedAHeroBefore)
        {
            //Created a generic way to play the announcers voice according to where a user clicked.
            string soundfile = "AnnouncerVoice/" + ((Image)sender).Name + ".mp3";
            soundPlayer.Open(new Uri(soundfile, UriKind.Relative));
            soundPlayer.Play();

            //I call the MouseEnter event in order to have the clicked picture glow and set the Selected bool to true 
            //to keep it highlighted.
            PreviousSelectedHero = SelectedHero;
            //Here I want to select the Image control by it's Name property. But it says I can't convert string to Image. ANy help?

            GetNormalImage(((Image)PreviousSelectedHero).Name);
            SelectedHero = ((Image)sender).Name;

        }

Ответы [ 3 ]

2 голосов
/ 18 декабря 2009

В качестве альтернативы созданию нескольких изображений вы можете использовать триггеры и BitMapEffects для выполнения большей части этого поведения. Здесь есть хороший учебник по созданию эффекта свечения при наведении мыши. Вы можете использовать аналогичный подход с DataTrigger, чтобы сохранить эффект свечения, пока изображение является «выбранным».

Пример настройки стиля для «свечения» изображения при наведении мыши:

  <Style.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
      <Setter Property="BitmapEffect">
        <Setter.Value>
          <OuterGlowBitmapEffect GlowColor="Red" GlowSize="4"/>
        </Setter.Value>
      </Setter>
    </Trigger>
  </Style.Triggers>

Как вы можете использовать нечто подобное, чтобы сохранить выбранное изображение светящимся независимо от наведения мыши:

<Style.Triggers>
    <DataTrigger Binding={Binding Path=IsSelected} Value="True">
      <Setter Property="BitmapEffect">
        <Setter.Value>
          <OuterGlowBitmapEffect GlowColor="Red" GlowSize="4"/>
        </Setter.Value>
      </Setter>
    </DataTrigger>
</Style.Triggers>
1 голос
/ 18 декабря 2009

Можно попробовать в HeroMouseClick ...

PreviousSelectedHero = SelectedHero;
SelectedHero = ((Image)sender).Name;

EDIT2 : Я предполагаю, что Xaml выглядит примерно так:

<StackPanel Name = "myContainer>
    <Image Name="heroOne" Source="source1.gif" />
    <Image Name="heroTwo" Source="source2.gid" />
</StackPanel>

Тогда в коде вы можете сделать:

using System.Linq;  //EDIT - you'll need this for any Linq query

var hero = 
    (from Image i in myContainer.Children
     where i.Name == previousSelectedHero.Name
     select i).Single(); 
     //this selected the Image from the StackPanel "myContainer" using the Images name attribue
     //and assigns it to hero

 hero.Source = GetNormalImage(hero.Name); 
//this should then set the deselected image back to its original source

Где "myContainer" - это то, в чем вы храните все изображения, хранящиеся в нем (например, панель стека или сетка или даже какой-то список). Учитывая, что это зависит от того, как изображения хранятся определенным образом, и что я записал их с головы до головы, это может быть или не быть полезным. Тем не менее, должен выбрать изображение, которое вы хотите изменить, и вернуть его обратно к оригиналу.

Подробнее Edit2: Я предполагаю, что это утверждение Linq, с которым вы боретесь. здесь - это ссылка на то, о чем Linq, а здесь - это набор образцов.

0 голосов
/ 18 декабря 2009

Я бы решил это так (псевдокод):

class HeroControl
{
  bool IsSelected {get;set;}

  MouseEnter()
  {
    if (!IsSelected) 
    {
      SetGlow(true);
    }
  }

  MouseLeave()
  {
    if (!IsSelected)
    {
      SetGlow(false);
    }
  }

  MouseDown()
  {
    IsSelected = true;

    // May be event invocation or method call or any other way.
    NotifySelectedHeroChanged(this); 
  }
}

class HeroesContainer
{
  List Heroes;

  OnCurrentHeroChanged(newHero, oldHero)
  {
   oldHero.IsSelected = false;
   // update new hero if needed.
  }
}

Да, довольно абстрактно. Но кто знает, может быть, это вам как-то поможет:).

Ура, Анвака.

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