0

我正在尝试使用下面的 XAML 在 BusyIndi​​cator 中实现文本滚动。我收到与访问 TargetName 相关的异常。有人可以帮忙吗?

背后的代码

// Locate Storyboard resource
Storyboard s = (Storyboard)TryFindResource("animation");
s.Begin(bsi_Indicator);

XAML 代码:

<xctk:BusyIndicator IsBusy="True" x:Name="bsi_Indicator">
        <xctk:BusyIndicator.BusyContentTemplate>  
            <DataTemplate>
                    <StackPanel Margin="4">
                        <Canvas Name="canvas1" Height="32" ClipToBounds="True"  VerticalAlignment="Top">
                        <TextBlock Name="ScrollText" FontFamily="Verdana" FontSize="12" Text="{Binding Path=DataContext.WaitText, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" >
                            <TextBlock.Resources>
                                <Storyboard x:Key="animation" Storyboard.TargetProperty="(Canvas.Left)" RepeatBehavior="Forever" >
                                    <DoubleAnimation Storyboard.TargetName="ScrollText" From="0" To="-50" Duration="0:0:10"  />
                                </Storyboard>
                            </TextBlock.Resources>
                        </TextBlock>
                    </Canvas>
                        <ProgressBar Value="100" Height="20"/>
                    </StackPanel>
            </DataTemplate>
        </xctk:BusyIndicator.BusyContentTemplate>

        <xctk:BusyIndicator.ProgressBarStyle>
            <Style TargetType="ProgressBar">
                <Setter Property="Visibility" Value="Collapsed"/>
            </Style>
        </xctk:BusyIndicator.ProgressBarStyle>
        <ContentControl />
    </xctk:BusyIndicator>

错误:

Additional information: 'ScrollText' name cannot be found in the name scope of 'Xceed.Wpf.Toolkit.BusyIndicator'.
4

1 回答 1

0

我假设您StoryboardWindow资源中定义,例如,如果这是您的主要控制。

它找不到,因为它不在Parent 控件ScrollText的范围内,这又可能是任何东西。它也被加载在一个可能与它的工作方式不同的地方,它可能是延迟加载的,所以它可能不存在。Window BusyContentTemplateDataTemplateXceed

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    var dp = bsi_Indicator.BusyContentTemplate.LoadContent() as StackPanel;
    var canvas = dp.Children[0] as Canvas;
    var textBlock = canvas.Children[0] as TextBlock;
    var sb = textBlock.Resources["animation"] as Storyboard;
    sb.Begin(textBlock); // you can just call sb.Begin() too
}
于 2014-07-07T19:04:29.723 回答