其他元素后面的 Wpf 文本选取框

Posted

技术标签:

【中文标题】其他元素后面的 Wpf 文本选取框【英文标题】:Wpf Text marquee behind other element 【发布时间】:2016-01-14 23:45:18 【问题描述】:

我构建了一个带有动画文本的消息栏, see the .gif from the animation。 就像您可以在前景中看到文本“fly's”并隐藏占位符一样。但我需要前台的占位符。

我的第一个想法是改变动画的区域

doubleAnimation.To = tbInfo.ActualWidth *-1;

doubleAnimation.To = boLogo.ActualWidth;

但结果如下所示:version with other animation area。

如何在前台设置占位符,让动画“飞”在它后面?


我的 XAML 代码

<Canvas x:Name="canMain" HorizontalAlignment="Stretch" VerticalAlignment="Center">
    <Border x:Name="boLogo" Height="40" Background="Gray" Canvas.Left="0" Canvas.Top="-20">
        <Button Content="Placeholder" Width="90" />
    </Border>
    <TextBlock x:Name="tbInfo" Visibility="Hidden" FontSize="32" FontWeight="Bold"  Padding="5" HorizontalAlignment="Stretch" VerticalAlignment="Center"></TextBlock>
</Canvas>

以及显示窗口的代码

public void ShowWindow(string str)

    tbInfo.Text = str;
    this.Height = 39;
    this.Width = SystemParameters.WorkArea.Width;
    this.Left = SystemParameters.PrimaryScreenWidth - this.Width;
    this.Show();

    TextMarquee(20);


private void TextMarquee(int duration)

    double height = canMain.ActualHeight - tbInfo.ActualHeight;
    tbInfo.Margin = new Thickness(0, height / 2, 0, 0);
    DoubleAnimation doubleAnimation = new DoubleAnimation();
    doubleAnimation.From = canMain.ActualWidth;
    doubleAnimation.To = tbInfo.ActualWidth * -1;
    doubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
    doubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(duration));
    tbInfo.BeginAnimation(Canvas.LeftProperty, doubleAnimation);
    tbInfo.Visibility = Visibility.Visible;

【问题讨论】:

【参考方案1】:

使用 Panel.ZIndex:

<Canvas x:Name="canMain" >
<Border x:Name="boLogo" Panel.ZIndex="2">
    <Button Content="Placeholder" Width="90" />
</Border>
<TextBlock x:Name="tbInfo" Panel.ZIndex="1"></TextBlock>
</Canvas>

https://msdn.microsoft.com/de-de/library/system.windows.controls.panel.zindex%28v=vs.110%29.aspx

【讨论】:

【参考方案2】:

试试 Grid.ZIndex:

<Grid x:Name="canMain" >
    <Border x:Name="boLogo" Grid.ZIndex="2">
        <Button Content="Placeholder" />
    </Border>
    <TextBlock x:Name="tbInfo" Grid.ZIndex="1"/>
</Grid>

成为ZIndex = "2" 最显眼的层。

【讨论】:

我尝试在其周围设置网格并在其周围设置画布。喜欢here。但这并没有改变任何东西。 您使用的是doubleAnimation.To = tbInfo.ActualWidth *-1; 对吗?您也可以尝试更改元素的顺序。首先是文本块,然后是边框。 是的,我愿意。请参阅@O.DO 的答案,Panel.ZIndex 是要走的路。

以上是关于其他元素后面的 Wpf 文本选取框的主要内容,如果未能解决你的问题,请参考以下文章

WPF 选取框文本动画

WPF 滚动选取框 - HandOffBehavior

jquery 选中文本框 jquery 文本框样式 jquery 改变样式

如何在 WPF 中制作选取框进度条?

Android Widget:Textview 在主页滚动时停止选取框

UILabel 文本发光和选取框