У меня есть <Border>
, внутри которого есть <Image>
и <Textblock>
, и я пытаюсь изменить текст текстового блока на Mouseleftbutton down, так как в этом событии click есть более длинная операция, текст текста блок не изменяется до завершения этой операции.Измените текст в текстовом блоке на клике
также я пробовал Dispatcher.BeginInvoke()
, но не удался.
Вот мой код:
<Border x:Name="btnReadMe" Grid.Row="0" Style="{StaticResource BorderStyle1}" MouseLeftButtonDown="btnReadMe_MouseLeftButtonDown" MouseLeftButtonUp="btnReadMe_MouseLeftButtonUp" >
<Border.Background>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="#46c746" Offset="0"/>
<GradientStop Color="#129312" Offset="1"/>
</LinearGradientBrush>
</Border.Background>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*"/>
<ColumnDefinition Width="6*"/>
</Grid.ColumnDefinitions>
<Image Grid.Column="0" Source="/CareFamily.AtHome;component/Resources/read_message-read_it.png" Margin="5,15" >
<Image.RenderTransform>
<ScaleTransform ScaleX="1" ScaleY="1"/>
</Image.RenderTransform>
</Image>
<StackPanel Grid.Column="1" Margin="0,10,0,10" VerticalAlignment="Center">
<TextBlock Name="tbReadToMe" Text="Read to Me" Style="{StaticResource TextBlockStyle1}" Margin="0,0,0,0" />
</StackPanel>
</Grid>
</Border>
SpVoice voice;
private void btnReadMe_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (voice == null)
voice = new SpVoice();
string readMessageState = tbReadToMe.Text;
switch (readMessageState)
{
case "Read to Me":
{
tbReadToMe.Text = "Pause";
break;
}
case "Pause":
{
tbReadToMe.Text = "Resume";
voice.Pause();
break;
}
case "Resume":
{
tbReadToMe.Text = "Pause";
voice.Resume();
break;
}
default:
{
tbReadToMe.Text = "Read to Me";
break;
}
}
if (!string.IsNullOrEmpty(Msg.Subject))
{
voice.Speak(Msg.Subject, SpeechVoiceSpeakFlags.SVSFDefault);
}
if (!string.IsNullOrEmpty(Msg.Body))
{
voice.Speak(Msg.Body, SpeechVoiceSpeakFlags.SVSFDefault); // Length operation
}
}
Вы призывающую к длительной операции на отдельном потоке? Если нет, он запускается в потоке пользовательского интерфейса, и вызов изменения текста в Диспетчере ничего не сделает, поскольку он ждет завершения длительной операции. Увидеть часть вторичной операции поможет. Кроме того, вы можете захотеть изучить класс «BackgroundWorker» и его событие «ProgressChanged». –