c# - 从 XAML 到 C# 的 WPF 故事板
问题描述
我有一个自定义 Ticker 控件,它适用于静态值,但要让它适用于动态值,我需要在代码中执行此操作,因为我必须延迟情节提要执行,直到 TextBlock 被渲染。我需要将以下 XAML 转移到 C# 中,但它不起作用:
<Canvas x:Name="PART_TickerCanvas" Grid.Row="1" Width="128" ClipToBounds="True">
<TextBlock x:Name="PART_TickerTextBlock">
<TextBlock.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="TickerTranslateTransform"
Storyboard.TargetProperty="X"
From="{Binding ElementName=TickerCanvas, Path=ActualWidth}" To="{Binding ElementName=PART_TickerTextBlock, Path=RenderSize.Width, Converter={StaticResource TextBlockWidthConverter}}" Duration="0:0:10"
RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</TextBlock.Triggers>
<TextBlock.RenderTransform>
<TranslateTransform x:Name="TickerTranslateTransform" X="{Binding ElementName=PART_TickerCanvas, Path=ActualWidth}" Y="0" />
</TextBlock.RenderTransform>
</TextBlock>
</Canvas>
转换器简单地否定宽度。
这是我的 C# 方法:
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
if (Template != null)
{
_tickerTextBlock = Template.FindName("PART_TickerTextBlock", this) as TextBlock;
_tickerCanvas = Template.FindName("PART_TickerCanvas", this) as Canvas;
Dispatcher.BeginInvoke(new Action(() => {if (_tickerCanvas != null && _tickerTextBlock != null) StartTickerAnimation(); }), DispatcherPriority.ContextIdle, null);
}
}
private void StartTickerAnimation()
{
var doubleAnimation = new DoubleAnimation
{
From = _tickerCanvas.ActualWidth,
To = -_tickerTextBlock.RenderSize.Width,
RepeatBehavior = RepeatBehavior.Forever,
Duration = new Duration(new TimeSpan(0, 0, 10))
};
_tickerTextBlock.RenderTransform = new TranslateTransform(_tickerCanvas.ActualWidth, 0);
RegisterName("TickerTranslateTransform", _tickerTextBlock.RenderTransform);
var storyBoard = new Storyboard();
storyBoard.Children.Add(doubleAnimation);
storyBoard.SetValue(Storyboard.TargetNameProperty, "TickerTranslateTransform");
storyBoard.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath(TranslateTransform.XProperty.Name));
storyBoard.SetValue(Storyboard.TargetProperty, _tickerTextBlock.RenderTransform);
_tickerTextBlock.BeginStoryboard(_storyBoard);
}
我很确定 DoubleAnimation 在 C# 中是正确的,但之后出现了问题。任何帮助将不胜感激。
解决方案
你不需要故事板。
X
像这样直接启动属性的动画:
_tickerTextBlock.RenderTransform.BeginAnimation(
TranslateTransform.XProperty, doubleAnimation);
推荐阅读
- sql - PostgreSQL:在 SQL 脚本中并行运行 SQL 语句
- python - pipenv 无法使用 pytorch 索引找到正确的包版本
- javascript - 如何检查axios响应数据是否为空
- visual-c++ - 代码分析警告 C26481 和带有布尔数组的 std::map
- javascript - 在谷歌时间线图中用jquery填充颜色选择矩形?
- json - Esper:如何在 Json 中查询数组
- sql-server - JPA 和 SQL Server 的 ORDER BY 子句中的列无效
- python - 连续有效地在 3 个不同的 .py 文件中加载单个 numpy 数组?
- google-sheets - 多人同时使用工作表
- python - 在 Raspberry Pi 上安装密码学时出现问题