【问题标题】:Slider and Label/Textblock control interaction - WPF滑块和标签/文本块控件交互 - WPF
【发布时间】:2011-08-26 23:47:14
【问题描述】:

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

  1. 我一次只需要显示 3 个单词。每隔 1 秒,移动到下一组 3 个单词。
  2. 滑块用于选择一次可以看到的单词数。因此用户可以将其增加到 10 个,现在每 1 秒需要显示一组 10 个单词。

如何在 WPF 中实现这种行为?我知道我需要在滑块和标签之间进行某种数据绑定,但不确定如何获得 (1) 或 (2) 的效果。

感谢任何帮助!

【问题讨论】:

    标签: .net wpf data-binding animation


    【解决方案1】:

    这是我在不使用我的 {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”以检测单词何时全部显示并执行适当的操作(如重新开始或停止动画)。

    【讨论】:

    • 谢谢!我想我是在叫错树了。我希望使用多线程来实现这一点,其中当用户移动滑块时,线程会执行 BeginInvoke 来更新 UI。这似乎是一种不同的方式。关于我可以在哪里阅读这些东西的任何帮助?
    • 可以参考的一本书是 Adam Nathan 的书 Windows Presentation Foundation Unleashed。从头到尾阅读。 StackOverflow 上也有很多博客和问题可以给你一些想法。下载一些带有源代码的 WPF 应用程序和库,看看它们是如何工作的。查看内置模板以了解它们是如何工作的(将 Reflector 与 BamlViewer 加载项一起使用)。这些是我的建议。
    • 您需要为滑块填写所需的 MinValue 和 MaxValue,可能还有一些其他设置,具体取决于您希望它的外观。这就是第 2 步中的“...”所要表示的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多