none
Mudar um botão de "Iniciar Thread" para "Abortar Thread" RRS feed

  • Pergunta

  • Gostaria de fazer um botão que a princípio teria um Iniciar. Quando clicar nele, vou iniciar uma thread em Background. Gostaria que ele automaticamente alterasse algumas coisas como por exemplo o texto que ele apresenta e o command q ele vai disparar se for clicado. Isso pois quero transformar o Iniciar Thread em Abortar Thread e disparar um outro command que vai dar um abort na thread.

    Como posso fazer isso da melhor maneira possível?

    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    quarta-feira, 27 de janeiro de 2010 11:51

Respostas

  • Pela sua pergunta, você deve estar usando o pattern MVVM, assim você deve ter no ViewModel uma propriedade TextoBotao, que é ligada ao Content do botão e uma propriedade ComandoBotao que está ligada ao Command do botão. Aí você faz:

    public ICommand ComandoBotao
    {
      get
      {
         if (threadAtiva)
           return new RelayCommand(ExecutaThreadAtiva);
         else  
           return new RelayCommand(ExecutaThreadInativa);
      }
    }

    ExecutaThreadAtiva e ExecutaThreadInativa mudam a propriedade TextoBotao e fazem as coisas que você quer.

    Bruno

    MVP Client Development - http://msmvps.com/blogs/bsonnino
    quinta-feira, 28 de janeiro de 2010 08:21
  • Então use um ToggleButton com a propriedade Checked ligada a uma propriedade que indica se a thread está ativa e mude as propriedades via triggers no template.

    Bruno
    MVP Client Development - http://msmvps.com/blogs/bsonnino
    quinta-feira, 28 de janeiro de 2010 19:50
  • O código xaml é assim:

    <ToggleButton IsChecked="{Binding ThreadLigada, Mode=TwoWay}" >
        <ToggleButton.Style>
            <Style TargetType="{x:Type ToggleButton}">
                <Setter Property="Content" Value="Liga thread"/>
                <Style.Triggers>
                    <Trigger Property="IsChecked" Value="True">
                        <Setter Property="Content" Value="Desliga thread"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ToggleButton.Style>
    </ToggleButton>

    A propriedade ThreadLigada do ViewModel é mais ou menos assim:

    public bool ThreadLigada
    {
      get {return threadLigada;}
      set
      {
          if (value != threadLigada)
          {
             if (value)
               LigaThread();
             else
               CancelaThread();
             threadLigada = value;
             RaiseNotifyPropertyChanged("ThreadLigada");
          }
      }
    }

    Bruno

    MVP Client Development - http://msmvps.com/blogs/bsonnino
    sábado, 30 de janeiro de 2010 08:27

Todas as Respostas

  • Pela sua pergunta, você deve estar usando o pattern MVVM, assim você deve ter no ViewModel uma propriedade TextoBotao, que é ligada ao Content do botão e uma propriedade ComandoBotao que está ligada ao Command do botão. Aí você faz:

    public ICommand ComandoBotao
    {
      get
      {
         if (threadAtiva)
           return new RelayCommand(ExecutaThreadAtiva);
         else  
           return new RelayCommand(ExecutaThreadInativa);
      }
    }

    ExecutaThreadAtiva e ExecutaThreadInativa mudam a propriedade TextoBotao e fazem as coisas que você quer.

    Bruno

    MVP Client Development - http://msmvps.com/blogs/bsonnino
    quinta-feira, 28 de janeiro de 2010 08:21
  • Bruno, eu tinha pensado em algo com templates. Isso até fica legal com a parte dos comandos, mas mudar a escrita via binding achei pouco flexível.
    Mas obrigado pela resposta.
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    quinta-feira, 28 de janeiro de 2010 19:41
  • Então use um ToggleButton com a propriedade Checked ligada a uma propriedade que indica se a thread está ativa e mude as propriedades via triggers no template.

    Bruno
    MVP Client Development - http://msmvps.com/blogs/bsonnino
    quinta-feira, 28 de janeiro de 2010 19:50
  • Bruno, você tem algum exemplo que eu possa utilizar?
    Estou procurando um jeito de fazer isso com ao clicar o botão disparar essa trigger mas não consigo de jeito nenhum achar algo que me ajude. nunca sei onde encaixar os exemplos de forma que funcione.

    Obrigado

    Leandro
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    sábado, 30 de janeiro de 2010 01:13
  • O código xaml é assim:

    <ToggleButton IsChecked="{Binding ThreadLigada, Mode=TwoWay}" >
        <ToggleButton.Style>
            <Style TargetType="{x:Type ToggleButton}">
                <Setter Property="Content" Value="Liga thread"/>
                <Style.Triggers>
                    <Trigger Property="IsChecked" Value="True">
                        <Setter Property="Content" Value="Desliga thread"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ToggleButton.Style>
    </ToggleButton>

    A propriedade ThreadLigada do ViewModel é mais ou menos assim:

    public bool ThreadLigada
    {
      get {return threadLigada;}
      set
      {
          if (value != threadLigada)
          {
             if (value)
               LigaThread();
             else
               CancelaThread();
             threadLigada = value;
             RaiseNotifyPropertyChanged("ThreadLigada");
          }
      }
    }

    Bruno

    MVP Client Development - http://msmvps.com/blogs/bsonnino
    sábado, 30 de janeiro de 2010 08:27
  • Vou testar e assim que obtiver um resultado dou um toque.
    Muito obrigado Bruno.


    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    segunda-feira, 1 de fevereiro de 2010 12:12