【问题标题】:Efficient marquee text control高效的选框文本控制
【发布时间】:2014-06-09 18:05:23
【问题描述】:

在我们的 WPF 应用程序中,我们需要一个简单的选取框文本控件,它在性能方面是轻量级和高效的。我尝试使用DoubleAnimation 这样做,但它使用了大量资源(主要来自 CPU)。我还尝试设置 TextBlock 的 Text 属性并每 100 纳秒从开头删除一个字符。这也没有提高性能。
那么在 WPF 中设计选取框文本控件的最佳和最有效的方法是什么? (我们使用的是 .Net 4.0)

【问题讨论】:

  • 你试过简单的 html 吗?或 javascript
  • @DJKRAZE 在 WPF 应用程序中?
  • @DJKRAZE 你的意思是使用网络浏览器?我们不能使用 Web 浏览器,因为我们的应用程序具有透明度,并且 .Net 的默认 Web 浏览器(它只是 IE 的一个包装器)不支持透明的主机窗口,免费的替代品仅支持 32 位环境。所以目前,我们无法这样做。
  • 我最后一次做这样的事情是按照this question 上的答案,你正在尝试类似的东西并且仍然看到相同的性能问题?
  • @ChrisW。其实我的方法是一样的,我以前看过这个帖子。但坦率地说,这一次,我只是复制粘贴了代码,它看起来很高效,而且它的性能比我的方法要好得多。所以我正在调查为什么我的实施速度很慢,我会在弄清楚后立即报告。

标签: c# wpf wpf-controls marquee


【解决方案1】:

感谢@Chris W. 和this question,这是我最终想到的(我想要 rtl 语言的从左到右的动画):

<Window x:Class="WpfApplication9.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication9"
        Title="MainWindow" Height="83" Width="222">
    <Grid x:Name="layoutRoot">
        <Canvas x:Name="canvas">
            <TextBlock Text="StackOverflow is just awesome!" FontSize="25"  x:Name="tb1" Canvas.Left="-131" Loaded="tb1_Loaded">
                <TextBlock.Resources>
                    <Storyboard x:Key="slide">
                        <DoubleAnimation From="0" To="{Binding Width, ElementName=tb1}" Duration="00:00:4"
                      Storyboard.TargetProperty="X"
                      Storyboard.TargetName="transferCurreny"
                      RepeatBehavior="Forever"/>
                    </Storyboard>
                </TextBlock.Resources>
                <TextBlock.RenderTransform>
            <TranslateTransform x:Name="transferCurreny" X="0"/>
        </TextBlock.RenderTransform>
                <TextBlock.Triggers>
                    <EventTrigger RoutedEvent="TextBlock.Loaded">
                        <BeginStoryboard Storyboard="{StaticResource slide}" />
                    </EventTrigger>
                </TextBlock.Triggers>
            </TextBlock>
        </Canvas>
    </Grid>
</Window>

代码隐藏:

using System.Windows;

namespace WpfApplication9
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void tb1_Loaded(object sender, RoutedEventArgs e)
        {
            tb1.Width = tb1.ActualWidth;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多