是否可以在没有xaml的情况下打开WPF IneractionRequest(Prism)?

是否可以在没有xaml的情况下打开WPF IneractionRequest(Prism)?,wpf,prism,Wpf,Prism,在xaml中,通常必须在InteractionTriggers中有一个InteractionRequestTrigger,但我很好奇是否有一种方法可以在代码隐藏中完成所有这些。我已经启动并运行了一些代码,但我认为问题在于没有设置InteractionRequest中引发的事件 我相信你们中的许多人都想问“你们为什么要这样做?”但请暂时忽略这个问题 private void OnInteractionRequestEvent(InteractionRequestEventInfo info

在xaml中,通常必须在InteractionTriggers中有一个InteractionRequestTrigger,但我很好奇是否有一种方法可以在代码隐藏中完成所有这些。我已经启动并运行了一些代码,但我认为问题在于没有设置InteractionRequest中引发的事件

我相信你们中的许多人都想问“你们为什么要这样做?”但请暂时忽略这个问题

    private void OnInteractionRequestEvent(InteractionRequestEventInfo info)
    {
        lock (_irLock)
        {
            var ir = new InteractionRequest<INotification>();
            InteractionRequestTrigger irt = new InteractionRequestTrigger();
            PopupNotificationAction pna = new PopupNotificationAction();
            pna.ElementToParent = info.Parent;
            pna.CenterOverAssociatedObject = true;
            pna.IsModal = true;
            pna.WindowContent = info.View;
            irt.Actions.Add(pna);

            irt.SourceObject = ir;
            ir.Raise(info.Notification, info.Callback);
        }
    }
私有void OnInteractionRequestEvent(InteractionRequestEventInfo)
{
锁(_irLock)
{
var ir=新的InteractionRequest();
InteractionRequestTrigger irt=新的InteractionRequestTrigger();
PopupNotificationAction pna=新的PopupNotificationAction();
pna.ElementToParent=info.Parent;
pna.CenterOverAssociatedObject=true;
pna.IsModal=true;
pna.WindowContent=info.View;
irt.Actions.Add(pna);
irt.SourceObject=ir;
ir.Raise(信息通知、信息回调);
}
}
这就是我目前所拥有的。

PopupNotificationAction是我们编写的,在以正常方式与xaml一起使用时可以工作。它来自PopupWindowAction

因此,为了使其正常工作,我做了以下更改:

private void OnInteractionRequestEvent(InteractionRequestEventInfo info)
{
        var ir = new InteractionRequest<INotification>();
        InteractionRequestTrigger irt = new InteractionRequestTrigger();
        PopupNotificationAction pna = new PopupNotificationAction();
        pna.ElementToParent = info.Parent;
        pna.CenterOverAssociatedObject = true;
        pna.IsModal = true;
        pna.WindowContent = info.View;
        irt.Actions.Add(pna);
        irt.Attach(parent);   // added
        irt.SourceObject = ir;
        ir.Raise(info.Notification, () =>
        {
            try
            {
                info.Callback()
            }
            catch
            {
                // exception handling
            }
            finally
            {
                 irt.Detach();   // added
            }
        );
}
私有void OnInteractionRequestEvent(InteractionRequestEventInfo)
{
var ir=新的InteractionRequest();
InteractionRequestTrigger irt=新的InteractionRequestTrigger();
PopupNotificationAction pna=新的PopupNotificationAction();
pna.ElementToParent=info.Parent;
pna.CenterOverAssociatedObject=true;
pna.IsModal=true;
pna.WindowContent=info.View;
irt.Actions.Add(pna);
irt.Attach(父项);//已添加
irt.SourceObject=ir;
ir.Raise(信息通知,()=>
{
尝试
{
info.Callback()
}
抓住
{
//异常处理
}
最后
{
irt.Detach();//已添加
}
);
}

那么,是什么让你认为这是一个好主意?(这与“why you do this”不同!)你有没有收到任何错误?没有错误。什么都没有发生。why试图对所有交互请求实现一个单一的入口点。如果你使用WPF,而你不想使用XAML,这其中的哪一部分提供了一个UI(用户交互)?你在那里用什么?我想你必须把这样的东西发挥出来。看看这里()。如果他们能在单元测试中实现这一点,你就可以让它以你想要的方式工作。你可能只需要以不同的方式处理它。我猜想,
InteractionRequestTrigger
的设计目的是,除非它附加到某个对象上(因为它是一个附加的触发器),否则它不会做任何事情。首先,我会尝试将它附加到某个对象(可能是
irt.attach(this)
)。请注意,如果您只执行一次,而不是每次请求交互时都这样做会更好—这至少是在XAML中执行时的结果。