【问题标题】:WPF: How to created a routed event for content changed?WPF:如何为内容更改创建路由事件?
【发布时间】:2016-04-03 10:37:33
【问题描述】:

我有一个框架。我用这一行切换页面:

FrameName.Content = new PageName();

我希望在页面发生更改时开始创建情节提要,并且我希望在 XAML 中而不是在代码隐藏中进行。我试过以下代码:

<Frame.Triggers>
    <EventTrigger RoutedEvent="ContentChanged">
        <BeginStoryboard Storyboard="{StaticResource storyboardName}" />
    </EventTrigger>
</Frame.Triggers>

经过一番搜索,我意识到没有这种性质的内置路由事件。第一个答案here 表明

最动态的方法是简单地派生您自己的 label 控件,该控件提供 ContentChanged 事件。

我已尝试在此答案中实现代码:

using System.Windows;
using System.Windows.Controls;

namespace ContentChangedTest
{
    class MyFrame : Frame
    {
        public event DependencyPropertyChangedEventHandler ContentChanged;

        static MyFrame()
        {
            ContentProperty.OverrideMetadata(typeof(MyFrame), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnContentChanged)));
        }

        private static void OnContentChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e)
        {
            MyFrame frame = dp as MyFrame;

            if (frame.ContentChanged != null)
            {
                DependencyPropertyChangedEventArgs args = new DependencyPropertyChangedEventArgs(ContentProperty, e.OldValue, e.NewValue);
                frame.ContentChanged(frame, args);
            }
        }
    }
}

在 XAML 中我使用它看起来像这样:

<local:MyFrame ContentChanged="MyFrame_ContentChanged" />

问题是最终我需要在代码隐藏中创建一个事件处理程序MyFrame_ContentChanged。有没有办法在纯 XAML 中做到这一点?例如 - 我可以将 ContentChanged 依赖属性转换为某种路由事件吗?

【问题讨论】:

  • 我对 WPF 很陌生,所以这很可能是一个愚蠢的问题。但是,我将不胜感激。
  • 为了在EventTrigger 中使用它,您需要使用RoutedEvent。路由事件的定义与依赖属性类似。本教程是一个很好的起点:How to: Create a Custom Routed Event.
  • @Grx70,谢谢。您能否演示一下它是如何工作的以及如何将其与上面的代码集成?

标签: c# wpf xaml eventtrigger routed-events


【解决方案1】:

为了使用带有EventTriggers 的事件,它们应该是路由事件。路由事件的定义方式类似于依赖属性。以下是有关如何开始的快速教程:How to: Create a Custom Routed Event

这是一个派生自 ContentControl 的类的示例,它定义了一个 ContentChanged 事件:

public class MyContentControl : ContentControl
{
    public static readonly RoutedEvent ContentChangedEvent 
        = EventManager.RegisterRoutedEvent(
            "ContentChanged",
            RoutingStrategy.Bubble,
            typeof(RoutedEventHandler), 
            typeof(MyContentControl));

    public event RoutedEventHandler ContentChanged
    {
        add { AddHandler(ContentChangedEvent, value); }
        remove { RemoveHandler(ContentChangedEvent, value); }
    }

    protected override void OnContentChanged(object oldContent, object newContent)
    {
        base.OnContentChanged(oldContent, newContent);
        RaiseEvent(new RoutedEventArgs(ContentChangedEvent, this));
    }
}

我还不确定为什么,但是在测试这条线在 Style 中工作时,直接在控件的触发器集合中使用时抛出了异常:

<EventTrigger RoutedEvent="ContentChanged">...</EventTrigger>

为了让它在这种情况下工作,我必须指定一个完全限定的事件路径:

<EventTrigger RoutedEvent="local:MyContentControl.ContentChanged">...</EventTrigger>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 2017-08-19
    • 2021-12-07
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    相关资源
    最近更新 更多