Usuário com melhor resposta
Mudar um botão de "Iniciar Thread" para "Abortar Thread"

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)
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- Marcado como Resposta LeandrodeMelloFagundes segunda-feira, 8 de fevereiro de 2010 12:39
-
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- Marcado como Resposta LeandrodeMelloFagundes segunda-feira, 8 de fevereiro de 2010 12:39
-
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- Marcado como Resposta LeandrodeMelloFagundes segunda-feira, 8 de fevereiro de 2010 12:39
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- Marcado como Resposta LeandrodeMelloFagundes segunda-feira, 8 de fevereiro de 2010 12:39
-
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) -
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- Marcado como Resposta LeandrodeMelloFagundes segunda-feira, 8 de fevereiro de 2010 12:39
-
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) -
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- Marcado como Resposta LeandrodeMelloFagundes segunda-feira, 8 de fevereiro de 2010 12:39
-