滑块和标签/文本块控件交互 - WPF

时间:2009-11-06 17:59:17

标签: .net wpf data-binding animation

我有一个滑块和一个标签控件。文本显示在标签中(几段)。

  1. 我需要一次只显示3个单词。每1秒钟,移动到下一组3个单词。
  2. 滑块用于选择一次可以看到的单词数。因此,用户可以将其增加到10,现在每1秒,需要显示一组10个单词。
  3. 如何在WPF中实现此行为?我知道我需要在滑块和标签之间进行某种数据绑定,但不知道如何获得(1)或(2)的效果。

    感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

以下是我在不使用{edf:ExpressionBinding}功能的情况下解决问题的方法(唉,目前尚未公开发布):

步骤1:在您的班级中创建三个DependencyProperties(不是传统的NET属性):

 Text
 WordsPerGroup
 GroupToShow

步骤2:将Slider绑定到“WordsPerGroup”属性:

 <Slider ... Value="{Binding WordsPerGroups}" />

步骤3:使用LinearInt32KeyFrame创建动画,为“GroupToShow”属性设置动画,该属性每秒计数一次并持续任意长度,例如持续1小时并计入3600:

 <Int32AnimationUsingKeyFrames Storyboard.TargetProperty="GroupToShow" ...>
   <LinearInt32KeyFrame KeyTime="01:00:00" Value="3600" />
 <Int32AnimationUsingKeyFrames>

步骤4:创建一个转换器,它接受“Text”,“GroupToShow”和“WordsPerGroup”并返回要显示的文本:

public SelectWordsConverter : IMultiValueConverter
{
  public object ConvertTo(object [] values, ...)
  {
    string text = values[0] as string;
    int groupToShow = values[1] as int;
    int wordsPerGroup = values[2] as int;  // maybe double, depending on slider binding

    return
      string.Join(" ",
        text
         .Split(" ", StringSplitOptions.RemoveEmptyEntries)
         .Skip(groupToShow * wordsPerGroup)
         .Take(wordsPerGroup)
      );
   }
   ...

步骤5:使用MultiBinding使用转换器绑定TextBlock的Text属性:

<TextBlock ...>
  <TextBlock.Text>
    <MultiBinding Converter="{x:Static local:SelectWordsConverter.Instance}">
      <Binding Path="Text" />
      <Binding Path="GroupToShow" />
      <Binding Path="WordsPerGroup" />
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>

步骤6:确保您在加载时或在您希望动画开始移动时开始动画。

步骤7 :(可选)将PropertyChangedCallback添加到“GroupToShow”以检测单词何时全部显示并执行适当的操作(如重新开始或停止动画)。