【问题标题】:WPF contentcontrol routedevent resource file list for eventWPF contentcontrol routedevent 事件资源文件列表
【发布时间】:2011-03-25 16:32:37
【问题描述】:

所以我有一个带有路由事件的内容控件:

public class TestBlind : ContentControl
{
public static readonly RoutedEvent VisibilityVisibleEvent =
        EventManager.RegisterRoutedEvent("VisibilityVisible", RoutingStrategy.Tunnel, typeof(Visibility), typeof(TestBlind));

    public event RoutedEventHandler VisibilityVisible
    {
        add { AddHandler(VisibilityVisibleEvent, value); }
        remove { RemoveHandler(VisibilityVisibleEvent, value); }
    }

    [Category("TestBlind")]
    public bool IsContentVisible
    {
        get { return (bool)GetValue(IsContentVisibleProperty); }
        set { SetValue(IsContentVisibleProperty, value); }
    }

    public static readonly DependencyProperty IsContentVisibleProperty = DependencyProperty.Register("IsContentVisible", typeof(bool), typeof(TestBlind),
        new FrameworkPropertyMetadata(new PropertyChangedCallback(OnIsOverlayContentVisibleChanged)));


    private static void OnIsOverlayContentVisibleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TestBlind blind = d as TestBlind;
        if (blind != null)
            SetVisibility(blind);
    }

    private static void SetVisibility(TestBlind blind)
    { 
        blind.Visibility = blind.IsContentVisible ? Visibility.Visible : Visibility.Hidden;
        blind.RaiseEvent(blind.Visibility == Visibility.Visible ? new RoutedEventArgs(VisibilityVisibleEvent) : new RoutedEventArgs(VisibilityHiddenEvent));            
    }
}

当依赖属性改变时触发这个事件。我想要的是能够在事件触发时触发动画。

在我的控件资源文件中,我有以下操作(我认为)会调用查看事件并启动动画:

<Grid.Triggers>
                        <EventTrigger RoutedEvent="control:TestBlind.VisibilityVisible">
<!--                            <EventTrigger RoutedEvent="ContentControl.Loaded">-->
                            <EventTrigger.Actions>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <DoubleAnimationUsingKeyFrames Duration="00:00:02.25" BeginTime="00:00:00" Storyboard.TargetName="backdDropGlow" Storyboard.TargetProperty="Opacity">
                                            <SplineDoubleKeyFrame KeyTime="00:00:00.00" Value="0"/>
                                            <SplineDoubleKeyFrame KeyTime="00:00:02.25" Value="1"/>
                                        </DoubleAnimationUsingKeyFrames>
                                    </Storyboard>
                                </BeginStoryboard>
                            </EventTrigger.Actions>
                        </EventTrigger>

如果我使用 ContentControl.Loaded 动画将起作用(虽然仅在第一次更改控件的属性时),但如果我尝试为我的事件注册它,则没有任何反应。

这可能吗,我完全错了吗?我希望这是有道理的。

谢谢

【问题讨论】:

    标签: wpf routed-commands contentcontrol


    【解决方案1】:

    为什么不在 DependnecyProperty 更改时触发动画而不是使用事件?

    我过去通过将事件附加到构造函数中的 DependencyPropertyDescriptor 来完成此操作

    public TestBlind()
    {
        DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(TestBlind.VisibilityVisible, typeof(TestBlind));
        if (dpd != null) dpd.AddValueChanged(this, delegate { IsVisibilityVisibleChanged(); });
    }
    
    private void IsVisibilityVisibleChanged()
    {
        bool isShown = GetVisibilityVisible(this);
        if (isShown)
        {
            Storyboard animation = (Storyboard)this.FindResource("MyStoryboard");
            animation.Begin();
        }
    }
    

    【讨论】:

    • 那会更好...没有意识到如果你在 contentcontrol 上你可以找到控件,以为它正在向下树,但现在考虑它可能在同一级别的树?会试试看。谢谢
    • 不幸的是我无法让它工作,也是空的:object fadeIn = FindName("fadeInBackGround");对象 mygrid = FindName("backdDropGlow");对象 fadeRes = TryFindResource("fadeInBackGround"); object mygridRes = TryFindResource("backdDropGlow");
    • @Jon 您的故事板在 XAML 中是如何/在哪里定义的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多