TargetName 属性无法在 Style Setter 上设置,那么它是如何设置的呢?

2023-12-27

过去一周我一直在探索 WPF,所以它对我来说仍然很陌生。我正在做的事情之一是简单的动画。在本例中是一个弹跳的笑脸。

我的攻击计划是:

  1. 做一个笑脸。我已经做到了这一点。
  2. 计算一个简单对象的弹跳动画。我已经做到了这一点。
  3. 抽象该动画,以便它可以在多个地方使用(笑脸的元素)。我被困在这里了。
  4. 将抽象的动画风格应用到笑脸的所有元素上。

在步骤 #2 之后,我得到了以下有效的 XAML:

<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="Test Window" Height="350" Width="620">
    <Grid>
        <Canvas Margin="0,180,0,0">
            <Ellipse Canvas.Left="10" Canvas.Top="10" Width="100" Height="100" Stroke="Blue" StrokeThickness="4" Fill="Aqua" />
            <Ellipse Canvas.Left="30" Canvas.Top="12" Width="60" Height="30">
                <Ellipse.Fill>
                    <LinearGradientBrush StartPoint="0.45,0" EndPoint="0.5, 0.9">
                        <GradientStop Offset="0.2" Color="DarkMagenta" />
                        <GradientStop Offset="0.7" Color="Transparent" />
                    </LinearGradientBrush>
                </Ellipse.Fill>
            </Ellipse>
            <Ellipse Canvas.Left="33" Canvas.Top="35" Width="20" Height="20" Stroke="Blue" StrokeThickness="3" Fill="White" />
            <Ellipse Canvas.Left="40" Canvas.Top="43" Width="6" Height="5" Fill="Black" />
            <Ellipse Canvas.Left="68" Canvas.Top="35" Width="20" Height="20" Stroke="Blue" StrokeThickness="3" Fill="White" />
            <Ellipse Canvas.Left="75" Canvas.Top="43" Width="6" Height="5" Fill="Black" />
            <Path Name="mouth" Stroke="Blue" StrokeThickness="4" Data="M 35,75 Q 55,90 80,75 " />
        </Canvas>
        <Grid Margin="100,5,0,0" Width="75" Height="300">
            <Canvas>
                <Ellipse Height="40" Width="40" x:Name="theBall" Canvas.Left="16">
                    <Ellipse.Fill>
                        <RadialGradientBrush GradientOrigin="0.75,0.25">
                            <GradientStop Color="Yellow" Offset="0.0" />
                            <GradientStop Color="Red" Offset="1.0" />
                        </RadialGradientBrush>
                    </Ellipse.Fill>
                    <Ellipse.RenderTransform>
                        <TransformGroup>
                            <ScaleTransform x:Name="aniSquash"/>
                            <TranslateTransform x:Name="aniBounce"/>
                        </TransformGroup>
                    </Ellipse.RenderTransform>
                    <Ellipse.Triggers>
                        <EventTrigger RoutedEvent="Loaded">
                            <BeginStoryboard>
                                <Storyboard SpeedRatio="2.0">
                                    <DoubleAnimationUsingKeyFrames Duration="0:0:4.5" Storyboard.TargetName="aniBounce" Storyboard.TargetProperty="Y" RepeatBehavior="Forever">
                                        <LinearDoubleKeyFrame Value="120" KeyTime="0:0:0"/>
                                        <SplineDoubleKeyFrame Value="260" KeyTime="0:0:2.2" KeySpline="0, 0, 0.5, 0"/>
                                        <LinearDoubleKeyFrame Value="260" KeyTime="0:0:2.25"/>
                                        <SplineDoubleKeyFrame Value="120" KeyTime="0:0:4.5" KeySpline="0, 0, 0, 0.5"/>
                                    </DoubleAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames Duration="0:0:4.5" Storyboard.TargetName="aniSquash" Storyboard.TargetProperty="ScaleX" RepeatBehavior="Forever">
                                        <LinearDoubleKeyFrame Value="1" KeyTime="0:0:0"/>
                                        <LinearDoubleKeyFrame Value="1" KeyTime="0:0:2"/>
                                        <LinearDoubleKeyFrame Value="1.3" KeyTime="0:0:2.25"/>
                                        <LinearDoubleKeyFrame Value="1" KeyTime="0:0:2.5"/>
                                    </DoubleAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames Duration="0:0:4.5" Storyboard.TargetName="aniSquash" Storyboard.TargetProperty="ScaleY" RepeatBehavior="Forever">
                                        <LinearDoubleKeyFrame Value="1" KeyTime="0:0:0"/>
                                        <LinearDoubleKeyFrame Value="1" KeyTime="0:0:2"/>
                                        <LinearDoubleKeyFrame Value="0.7" KeyTime="0:0:2.25"/>
                                        <LinearDoubleKeyFrame Value="1" KeyTime="0:0:2.5"/>
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </Ellipse.Triggers>
                </Ellipse>
                <Rectangle Height="5" Canvas.Left="10" Canvas.Top="285" Width="55" Fill="Black"/>
            </Canvas>
        </Grid>
    </Grid>
</Window>

在更改上述步骤 #3 的工作 XAML 时,我引入了一个我不太理解的错误。这是修改后的 XAML,不起作用:

<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="Test Window" Height="350" Width="620">
    <Window.Resources>
        <TransformGroup x:Key="aniBounceAndSquash">
            <ScaleTransform x:Name="aniSquash"/>
            <TranslateTransform x:Name="aniBounce"/>
        </TransformGroup>
        <Style x:Key="styleBounceAndSquash" TargetType="FrameworkElement">
            <Setter Property="RenderTransform" Value="{StaticResource aniBounceAndSquash}" />
            <Style.Triggers>
                <EventTrigger RoutedEvent="Loaded">
                    <BeginStoryboard>
                        <Storyboard SpeedRatio="2.0">
                            <DoubleAnimationUsingKeyFrames Duration="0:0:4.5" Storyboard.TargetName="aniBounce" Storyboard.TargetProperty="Y" RepeatBehavior="Forever">
                                <LinearDoubleKeyFrame Value="120" KeyTime="0:0:0"/>
                                <SplineDoubleKeyFrame Value="260" KeyTime="0:0:2.2" KeySpline="0, 0, 0.5, 0"/>
                                <LinearDoubleKeyFrame Value="260" KeyTime="0:0:2.25"/>
                                <SplineDoubleKeyFrame Value="120" KeyTime="0:0:4.5" KeySpline="0, 0, 0, 0.5"/>
                            </DoubleAnimationUsingKeyFrames>
                            <DoubleAnimationUsingKeyFrames Duration="0:0:4.5" Storyboard.TargetName="aniSquash" Storyboard.TargetProperty="ScaleX" RepeatBehavior="Forever">
                                <LinearDoubleKeyFrame Value="1" KeyTime="0:0:0"/>
                                <LinearDoubleKeyFrame Value="1" KeyTime="0:0:2"/>
                                <LinearDoubleKeyFrame Value="1.3" KeyTime="0:0:2.25"/>
                                <LinearDoubleKeyFrame Value="1" KeyTime="0:0:2.5"/>
                            </DoubleAnimationUsingKeyFrames>
                            <DoubleAnimationUsingKeyFrames Duration="0:0:4.5" Storyboard.TargetName="aniSquash" Storyboard.TargetProperty="ScaleY" RepeatBehavior="Forever">
                                <LinearDoubleKeyFrame Value="1" KeyTime="0:0:0"/>
                                <LinearDoubleKeyFrame Value="1" KeyTime="0:0:2"/>
                                <LinearDoubleKeyFrame Value="0.7" KeyTime="0:0:2.25"/>
                                <LinearDoubleKeyFrame Value="1" KeyTime="0:0:2.5"/>
                            </DoubleAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <Canvas Margin="0,180,0,0">
            <Ellipse Canvas.Left="10" Canvas.Top="10" Width="100" Height="100" Stroke="Blue" StrokeThickness="4" Fill="Aqua" />
            <Ellipse Canvas.Left="30" Canvas.Top="12" Width="60" Height="30">
                <Ellipse.Fill>
                    <LinearGradientBrush StartPoint="0.45,0" EndPoint="0.5, 0.9">
                        <GradientStop Offset="0.2" Color="DarkMagenta" />
                        <GradientStop Offset="0.7" Color="Transparent" />
                    </LinearGradientBrush>
                </Ellipse.Fill>
            </Ellipse>
            <Ellipse Canvas.Left="33" Canvas.Top="35" Width="20" Height="20" Stroke="Blue" StrokeThickness="3" Fill="White" />
            <Ellipse Canvas.Left="40" Canvas.Top="43" Width="6" Height="5" Fill="Black" />
            <Ellipse Canvas.Left="68" Canvas.Top="35" Width="20" Height="20" Stroke="Blue" StrokeThickness="3" Fill="White" />
            <Ellipse Canvas.Left="75" Canvas.Top="43" Width="6" Height="5" Fill="Black" />
            <Path Name="mouth" Stroke="Blue" StrokeThickness="4" Data="M 35,75 Q 55,90 80,75 " />
        </Canvas>
        <Grid Margin="100,5,0,0" Width="75" Height="300">
            <Canvas>
                <Ellipse Height="40" Width="40" x:Name="theBall" Canvas.Left="16" Style="{StaticResource styleBounceAndSquash}">
                    <Ellipse.Fill>
                        <RadialGradientBrush GradientOrigin="0.75,0.25">
                            <GradientStop Color="Yellow" Offset="0.0" />
                            <GradientStop Color="Red" Offset="1.0" />
                        </RadialGradientBrush>
                    </Ellipse.Fill>
                </Ellipse>
                <Rectangle Height="5" Canvas.Left="10" Canvas.Top="285" Width="55" Fill="Black"/>
            </Canvas>
        </Grid>
    </Grid>
</Window>

错误“无法在样式设置器上设置 TargetName 属性。第 20 行位置 79。”

如果我无法在样式中设置它该如何设置?


好吧,事实证明你无法设置Storyboard.TargetName in a Style.Setter因为它是一种风格并且是抽象的。因此,不允许通过名称引用,因为“没有勺子”。所以我放弃了Storyboard.TargetName并寻找另一种方式。

我确实发现在Storyboard.TargetProperty您可以使用对象结构(有点像遍历 DOM)来引用您想要的对象。这样你就绕过了需要Storyboard.TargetName。由于我使用的是TransformGroupMS 文档并不是最友好的文档。最后,我得到了它,这里是为其他有同样问题的人提供的。

<Style x:Key="buttonSmiley" TargetType="{x:Type Button}">
    <Style.Resources>
        <Storyboard x:Key="OnVisibleStoryboard">
            <DoubleAnimationUsingKeyFrames Duration="0:0:2.75" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.Y)" >
                <LinearDoubleKeyFrame Value="75" KeyTime="0:0:0"/>
                <SplineDoubleKeyFrame Value="25" KeyTime="0:0:0.75" KeySpline="0, 0, 0.5, 0"/>
                <LinearDoubleKeyFrame Value="-25" KeyTime="0:0:1.2"/>
                <SplineDoubleKeyFrame Value="200" KeyTime="0:0:2.25" KeySpline="0, 0, 0, 0.5"/>
                <LinearDoubleKeyFrame Value="175" KeyTime="0:0:2.4" />
                <SplineDoubleKeyFrame Value="150" KeyTime="0:0:2.75" KeySpline="0, 0, 0, 0.5"/>
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Duration="0:0:5.5" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleX)" >
                <LinearDoubleKeyFrame Value="0.01" KeyTime="0:0:0"/>
                <LinearDoubleKeyFrame Value="1" KeyTime="0:0:1.25"/>
                <LinearDoubleKeyFrame Value="1" KeyTime="0:0:2.05"/>
                <LinearDoubleKeyFrame Value="1.15" KeyTime="0:0:2.15"/>
                <LinearDoubleKeyFrame Value="1" KeyTime="0:0:2.4"/>
                <LinearDoubleKeyFrame Value="1" KeyTime="0:0:2.75"/>
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Duration="0:0:5.5" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleY)" >
                <LinearDoubleKeyFrame Value="0.01" KeyTime="0:0:0"/>
                <LinearDoubleKeyFrame Value="1" KeyTime="0:0:1.25"/>
                <LinearDoubleKeyFrame Value="1" KeyTime="0:0:2.05"/>
                <LinearDoubleKeyFrame Value="0.75" KeyTime="0:0:2.2"/>
                <LinearDoubleKeyFrame Value="1" KeyTime="0:0:2.4"/>
                <LinearDoubleKeyFrame Value="1" KeyTime="0:0:2.75"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    </Style.Resources>
    <Style.Triggers>
        <Trigger Property="Visibility" Value="Visible">
            <Trigger.EnterActions>
                <RemoveStoryboard BeginStoryboardName="OnLoadStoryboard_BeginStoryboard"/>
                <BeginStoryboard x:Name="OnVisibleStoryboard_BeginStoryboard" Storyboard="{StaticResource OnVisibleStoryboard}"/>
            </Trigger.EnterActions>
        </Trigger>
        <EventTrigger RoutedEvent="Button.Loaded">
            <RemoveStoryboard BeginStoryboardName="OnVisibleStoryboard_BeginStoryboard"/>
            <BeginStoryboard x:Name="OnLoadStoryboard_BeginStoryboard" Storyboard="{StaticResource OnVisibleStoryboard}"/>
        </EventTrigger>
    </Style.Triggers>
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <Canvas Margin="-35,-35,0,0">
                    <Ellipse Canvas.Left="10" Canvas.Top="10" Width="50" Height="50" Stroke="Blue" StrokeThickness="2" Fill="#FFD8CF15" />
                    <Ellipse Canvas.Left="18" Canvas.Top="12" Width="33" Height="15">
                        <Ellipse.Fill>
                            <LinearGradientBrush StartPoint="0.45,0" EndPoint="0.5, 0.9">
                                <GradientStop Offset="0.2" Color="DarkMagenta" />
                                <GradientStop Offset="0.7" Color="Transparent" />
                            </LinearGradientBrush>
                        </Ellipse.Fill>
                    </Ellipse>
                    <Ellipse Canvas.Left="17" Canvas.Top="25" Width="10" Height="10" Stroke="Blue" StrokeThickness="2" Fill="White" />
                    <Ellipse Canvas.Left="20" Canvas.Top="28" Width="3" Height="3" Fill="Black" />
                    <Ellipse Canvas.Left="34" Canvas.Top="25" Width="10" Height="10" Stroke="Blue" StrokeThickness="2" Fill="White" />
                    <Ellipse Canvas.Left="37" Canvas.Top="28" Width="3" Height="3" Fill="Black" />
                    <Path Name="mouth" Stroke="Blue" StrokeThickness="2" Data="M 20,43 Q 27,53 40,44" />
                </Canvas>
            </DataTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="RenderTransform">
        <Setter.Value>
            <TransformGroup>
                <TranslateTransform />
                <ScaleTransform />
            </TransformGroup>
        </Setter.Value>
    </Setter>
</Style>

当然,如果我会完全放弃这种风格Button.Triggers集合中将允许正常触发器而不仅仅是事件触发器,谢谢 MS 让生活变得痛苦,呃嗯,我的意思是有趣。因为我两者都需要,所以我必须解决这个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TargetName 属性无法在 Style Setter 上设置,那么它是如何设置的呢? 的相关文章

随机推荐

  • 找到有向无环图的宽度......只能找到父母

    我试图找到有向无环图的宽度 由任意排序的节点列表表示 甚至没有邻接列表 该图 列表适用于类似 GNU Make 的并行工作流程管理器 该管理器使用文件作为执行顺序的标准 每个节点都有一个源文件和目标文件的列表 我们有一个哈希表 这样 给定文
  • 当数据形状为(x,y,z)时如何进行聚类?

    假设我有 10 个单独的观测值 每个观测值的大小为 125 59 我想根据这 10 个观测值的 2d 特征矩阵 125 59 对它们进行分组 这是否可以在不将每个观测值展平为 125 59 1D 矩阵的情况下实现 我什至无法实现 PCA 或
  • Promtail 错误管道阶段只能包含一个键

    尝试设置 Promtail 时出现以下错误 level error ts 2020 11 27T06 10 30 310583Z caller main go 104 msg 创建 promtail 时出错 error 无法创建文件目标管理
  • C/C++ 中的非线程安全文件 I/O

    在解决我们应用程序中的一些性能问题时 我发现 C 的stdio h函数 至少对于我们的供应商来说 C 的fstream类 是线程安全的 结果 每次我做一些简单的事情时fgetc RTL 必须获取锁 读取一个字节 然后释放锁 这对性能不利 在
  • 如何更改 UISearchBar +iPhone 中显示的取消按钮的默认文本

    我正在开发一个应用程序 我想更改搜索栏中搜索字符串的文本 我想更改搜索栏旁边显示的取消按钮的文本 在搜索栏中输入任何字符串之前 我们会将搜索字符串作为默认字符串 我想更改该字符串的文本 当我们单击该搜索栏时 我们会在搜索栏旁边看到一个取消按
  • Django:从日期时间字段查询时间

    在基于 Django 的 postgresql 数据库上 如何按时间过滤日期时间字段 如下所示 class Foo models Model start date models DateTimeField end date models D
  • Objective C 项目中的 Xcode 8.3 Swift 版本错误 (SWIFT_VERSION)

    我在纯 Objective C 项目中使用 Xcode 8 3 时遇到以下错误 我无法找到解决方案 我的构建设置中没有快速参数 而且我也无法在网上找到任何解决方案 有任何想法吗 几天前构建得很好 我能看到的唯一区别是 xcode 更新了 S
  • UnlockField 在 CakePHP 中不起作用

    只是想制作一个非常标准的用户编辑页面 密码 和 重新密码 开始隐藏 但可以通过单击 编辑密码 按钮将其打开 但是 我不断收到来自安全组件的 auth 黑洞错误 Per CakePHP 书 http book cakephp org 2 0
  • 如何创建Facebook风格的固定状态栏?

    我想通过 Web 表单创建固定状态栏以向用户显示各种状态 消息 通知 我可以使用固定 CSS 属性 但我想在 6 7 和 Firefox 中实现 以及所有浏览器 这是关于如何修复底部页面上的元素 栏的快速且简单的解决方案 jixedbar
  • Nashorn JS 对象对 java.util.Map 有效吗?

    我有java方法 void someMethod String str Map map 从 JS 调用这个方法 var map new Object map key1 val1 someMethod str map 例外 java lang
  • 我如何制作一个左/右侧圆润如圆的按钮

    我正在尝试制作一个侧面呈圆形的按钮 但是当我更改屏幕大小时 按钮侧面左侧呈圆形 不会保持纵横比 我认为 我想要每个尺寸的下一个切换按钮 如何为每个分辨率制作一个边角为圆角的 XML 我已阅读此内容 但这不是解决方案 如何让按钮的角变圆 ht
  • Tomcat应用部署监听器

    我想知道如何监听 Tomcat Web 应用程序部署 我希望每次从容器中取消部署应用程序或将应用程序部署到容器时都调用我的侦听器 我已经调查了一下并发现一些听众 即LifecycleListener可以通过 JMX 注册 但不幸的是 这个监
  • 在 iOS 中创建“流布局”类型布局的最佳/最简单方法是什么

    Q1 我有三个控件 UILabel UIButton and UILabel在一行中 我想以编程方式将它们一个接一个地排成一行 没有任何间隙 类似于Java Android Flowlayout 布局 因为每个控件上的文本长度会因用户操作而
  • 使用 Python 的 Mechanize 模块验证 br.submit()

    只是尝试使用 mechanize 登录网站 当我打印 br form 时 我可以看到我的凭据输入到我的表单中 但我不知道如何正确提交表格 我使用 br submit 并尝试通过打印 br title 来验证它是否已进入下一页 但出现的标题是
  • 使用 os.kill() 后如何找出子进程何时终止?

    我有一个 Python 程序 准确地说 是一个 Django 应用程序 它使用以下命令启动子进程subprocess Popen http docs python org 2 7 library subprocess html subpro
  • 如何在Windows上自动启动virtualenv环境

    谁能给我一些关于在 Windows 上自动启动 virtualenv 应用程序的建议 我有一个在 Gunicorn 上运行的小型 Flask 应用程序 运行良好 但是如何将其投入生产呢 我不想手动进入并 cd 进入目录并输入 activat
  • 如何排除图例中的系列 (Flex)

    在弹性图表中 我想画一些与特定系列相关的 参考线 之类的东西 因此 这些线不是独立的系列 不应在图例中显示 是否可以从图表图例中排除某些系列 谢谢 我详细阐述了 Luis B 的答案 使其动态地反映在折线图的数据提供者上 这样 图例仅显示图
  • 在 Java 中使用正则表达式查找重复模式

    我正在使用正则表达式来匹配以下字符串 String sample1 key value key value key value key value 正如您所看到的 key value 定期重复 唯一的分隔符是 管道 注意事项 键 gt 只是
  • 为什么“mvn verify”不运行我的集成测试?

    我有一个多模块项目 并且在根 pom 中定义了故障保护 如下所示
  • TargetName 属性无法在 Style Setter 上设置,那么它是如何设置的呢?

    过去一周我一直在探索 WPF 所以它对我来说仍然很陌生 我正在做的事情之一是简单的动画 在本例中是一个弹跳的笑脸 我的攻击计划是 做一个笑脸 我已经做到了这一点 计算一个简单对象的弹跳动画 我已经做到了这一点 抽象该动画 以便它可以在多个地