2011-12-09 3 views
0

У меня есть TextBlock на моей странице с Text значение null (""). Когда я нажимаю кнопку, я хочу изменить значение «Текст» для этого TextBlock, пауза полсекунды, а затем переместить TextBlock один пиксель за раз до определенной точки.Обновить макет страницы перед Thread.Sleep()

Я пробовал использовать Thread.Sleep(), но до сих пор у меня есть проблема. Я нажимаю кнопку, поток пользовательского интерфейса приостанавливается на полсекунды, затем появляется TextBlock и начинает двигаться. Я хочу, чтобы он появился, как только я нажимаю кнопку.

P.S .: Я знаю, что Thread.Sleep() не работает. Я готов использовать все, что работает.

ответ

4

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

Вот краткий пример того, как переместить texblock с помощью панели рассказов.

Элементы пользовательского интерфейса.

<Grid 
    x:Name="ContentPanel" 
    Grid.Row="1" 
    Margin="12,0,12,0"> 
    <TextBlock 
    Margin='79,263,177,307' 
    Name='textBlock1' 
    Text='TextBlock' 
    RenderTransformOrigin="0.5,0.5"> 
    <TextBlock.RenderTransform> 
     <CompositeTransform /> 
    </TextBlock.RenderTransform> 
    </TextBlock> 
    <Button 
    Content="Button" 
    Height="80" 
    Margin="116,0,188,144" 
    VerticalAlignment="Bottom" 
    Click='Button_Click' /> 
</Grid> 

Раскадровка, определенные в разделе страницы ресурсов.

<phone:PhoneApplicationPage.Resources> 
<Storyboard 
    x:Name="MoveTextBlockStoryboard"> 
    <DoubleAnimationUsingKeyFrames 
    Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" 
    Storyboard.TargetName="textBlock1"> 
    <EasingDoubleKeyFrame 
     KeyTime="0" 
     Value="0" /> 
    <EasingDoubleKeyFrame 
     KeyTime="0:0:1.1" 
     Value="120" /> 
    </DoubleAnimationUsingKeyFrames> 
    <DoubleAnimationUsingKeyFrames 
    Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" 
    Storyboard.TargetName="textBlock1"> 
    <EasingDoubleKeyFrame 
     KeyTime="0" 
     Value="0" /> 
    <EasingDoubleKeyFrame 
     KeyTime="0:0:1.1" 
     Value="-105" /> 
    </DoubleAnimationUsingKeyFrames> 
</Storyboard> 

Код, который изменяет текст и начинает раскадровку.

private void Button_Click(object sender, RoutedEventArgs e) { 
    textBlock1.Text = "new text"; 
    MoveTextBlockStoryboard.Begin(); 

} 
+0

+1, вот как вы это делаете. Перемещение элемента по странице вручную (в потоке пользовательского интерфейса!) - плохая идея. Я бы предложил против этого. – Joe

+0

Он работает как шарм. Благодаря! Извините за поздний знак в качестве ответа. –

3

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

+0

Или подумайте о приостановке в потоке BackgroundWorker, а затем перейдите в поток пользовательского интерфейса, чтобы обновить его. Но подход Криса лучше. – invalidusername

Смежные вопросы