gpt4 book ai didi

wpf - Caliburn Micro 'Enter' 关键事件

转载 作者:行者123 更新时间:2023-12-02 23:34:35 26 4
gpt4 key购买 nike

我正在尝试将事件与 Caliburn Micro 绑定(bind),但在向该方法获取正确消息时遇到一些问题。我想添加在更改文本框中的值后按“Enter”键的功能,并且它执行与旁边的按钮绑定(bind)的相同方法。但是,无论按下哪个键,我都会遇到以下异常:

A first chance exception of type 'System.InvalidCastException'occurred in MyApp.exe

A first chance exception of type'System.Reflection.TargetInvocationException' occurred in mscorlib.dll

A first chance exception of type'System.Reflection.TargetInvocationException' occurred inWindowsBase.dll

根据另一个类似问题的建议Binding KeyDown Event Silverlight ,我尝试过使用 ActionExecutionContext,但没有成功。

这是 xaml:

<TextBox Name="Threshold"                     
Margin="5"
Grid.Column="1"
>
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyDown">
<cal:ActionMessage MethodName="ExecuteFilterView">
<cal:Parameter Value="$executionContext"/>
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>

方法:

 public void ExecuteFilterView(ActionExecutionContext context)
{
//Do stuff...
}

我知道我可能可以省去一些麻烦,只需在后面的代码中执行一个标准事件处理程序,但这个应用程序是 MVVM 中的一个练习,并学习使用 Caliburn.Micro,所以我想坚持制作这个特定方法的工作。

我是否只是想发送事件中的错误信息?我的 xaml 编码是否正确,无法获得我想要的内容?或者我完全错过了其他东西?

最佳答案

刚刚进行了测试,这两个都对我有用:

使用完整语法:

    <TextBox Name="Threshold"                     
Margin="5"
Grid.Column="1">
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyDown">
<cal:ActionMessage MethodName="ExecuteFilterView">
<cal:Parameter Value="$executionContext"/>
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>

使用 CM 语法(更喜欢这种语法,因为它更具可读性)

    <TextBox Name="Threshold"                     
Margin="5"
Grid.Column="1"
cal:Message.Attach="[Event KeyDown] = [Action ExecuteFilterView($executionContext)]" />

这是测试虚拟机:

public class MainWindowViewModel
{
public void ExecuteFilterView(ActionExecutionContext context)
{
// This method is hit and the context is present and correct
}
}

您可以发布完整的代码吗?您确定框架设置正确吗? (您遵循入门示例了吗?

http://caliburnmicro.codeplex.com/wikipage?title=Basic%20Configuration%2c%20Actions%20and%20Conventions&referringTitle=Documentation

编辑:

好的,在您澄清之后,我可以给您一些如何执行此操作的示例 - 我会告诉您我的个人偏好和原因,但请选择最适合您的一个

  1. 使用 ActionExecutionContext 并转换 eventargs:
    cal:Message.Attach="[Event KeyDown] = [Action ExecuteFilterView($executionContext)]"
    public void ExecuteFilterView(ActionExecutionContext context)
{
var keyArgs = context.EventArgs as KeyEventArgs;

if (keyArgs != null && keyArgs.Key == Key.Enter)
{
// Do Stuff
}
}
  • 直接使用EventArgs
  •     cal:Message.Attach="[Event KeyDown] = [Action ExecuteFilterView($eventArgs)]"
        public void ExecuteFilterView(KeyEventArgs keyArgs)
    {
    if (keyArgs.Key == Key.Enter)
    {
    // Do Stuff
    }
    }
  • 我个人最喜欢的,创建您自己的 SpecialValues 字典条目:
  • 在您的 Bootstrapper.Configure 方法中...

    MessageBinder.SpecialValues.Add("$pressedkey", (context) =>
    {
    // NOTE: IMPORTANT - you MUST add the dictionary key as lowercase as CM
    // does a ToLower on the param string you add in the action message, in fact ideally
    // all your param messages should be lowercase just in case. I don't really like this
    // behaviour but that's how it is!
    var keyArgs = context.EventArgs as KeyEventArgs;

    if (keyArgs != null)
    return keyArgs.Key;

    return null;
    });

    您的行动:

    cal:Message.Attach="[Event KeyDown] = [Action ExecuteFilterView($pressedKey)]"

    代码:

    public void ExecuteFilterView(Key key)
    {
    if (key == Key.Enter)
    {
    // Do Stuff
    }
    }

    为什么这是我最喜欢的?这意味着您的虚拟机只接收您想要的值(大多数时候您不关心许多其他参数),并且您不需要知道如何或费心去转换 eventargs - 您只需操作即可关于值(value)。显然使用最适合你的东西

    还值得注意的是,如果您有其他类型的控件子类 KeyEventArgs 这也适用于它们。如果它们没有子类 KeyEventArgs 但它们仍然返回 Key 类型的值,这仍然可以工作,因为如果第一个失败,您可以向委托(delegate)添加另一个强制转换:

    例如

    MessageBinder.SpecialValues.Add("$pressedkey", (context) =>
    {
    var keyArgs = context.EventArgs as KeyEventArgs;

    if (keyArgs != null)
    return keyArgs.Key;

    // Ok so it wasn't KeyEventArgs... check for some other type - maybe a 3rd party implementation
    var thirdPartyKeyArgs = context.EventArgs as ThirdPartyKeyArgs;

    if (thirdPartyKeyArgs != null)
    return thirdPartyKeyArgs.KeyProperty;

    return null;
    });

    关于wpf - Caliburn Micro 'Enter' 关键事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16719496/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com