【问题标题】:What is the correct way to define classes in Xaml?在 Xaml 中定义类的正确方法是什么?
【发布时间】:2013-01-31 03:48:18
【问题描述】:

是一个新手,我正在使用框架 3.5 玩 Windows Presentation Foundation,我刚刚开始使用故事板和动画。我尝试创建 Canvas 实例并使用 Story Board + 动画实例为画布设置动画,这很有趣。现在我想想出一些有组织的方式,我可以轻松地定义许多动画并使用它们(在代码中定义对象实例太乏味了)。

我听说过使用 XAML 来执行此操作,并且我在 CodeProject.com 中看到了一些示例,但它们似乎都在定义 UserControls,其中包含情节提要。这对我来说似乎太难了,我想做的只是将故事板标签和故事板标签内的动画标签定义为一个类,是否可以这样做?我的意思是,是否可以在 XAML 中定义一个类(不是用户控件),然后在我想使用该特定动画时调用它的变量,如“StoryBoard1”或“StoryBoard2”?我应该如何实施它?

【问题讨论】:

    标签: wpf wpf-controls


    【解决方案1】:

    如果您想要可重复使用的动画,您可以在Window.Resources 中定义Storyboards 等。

    这些被称为Resources 而不是Classes

    例子:

    <Window x:Class="WpfApplication8.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="233" Width="405" Name="UI" >
        <Window.Resources>
            <Storyboard x:Key="MyAnimation" Storyboard.TargetProperty="Opacity">
                <DoubleAnimation From="0" To="1" Duration="0:0:5" />
            </Storyboard>
        </Window.Resources>
    
        <Grid>
            <Button Content="Animate" Name="button1" Opacity="0" >
                <Button.Style>
                    <Style TargetType="{x:Type Button}" >
                        <Style.Triggers>
                            <Trigger Property="IsPressed" Value="True">
                                <Trigger.EnterActions>
                                    <BeginStoryboard Storyboard="{StaticResource MyAnimation}" />
                                </Trigger.EnterActions>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                 </Button.Style>
            </Button>
        </Grid>
    </Window>
    

    要从后面的代码访问这些资源,您可以使用FindResource

    namespace WpfApplication8
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
                var storyboard = (Storyboard)FindResource("MyAnimation");
            }
        }
    }
    

    【讨论】:

    • 如何访问资源?我在 Window 中尝试了 Resources["MyAnimation"],但它返回 null
    • 用示例更新答案:)
    • 我仍然为空,我如何从代码中访问资源?你能展示一个 WpfApplication8.MainWindow 的简单代码示例吗?
    • 当我访问 {System.Windows.ResourceDictionary} 它总是空的
    • 确保命名空间匹配 Xaml: x:Class="WpfApplication8.MainWindow"CS: namespace WpfApplication8 添加到答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多