Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Windows 8应用程序中使用MessageBinder.SpecialValue不起作用?_C#_Mvvm_Windows 8_Caliburn.micro - Fatal编程技术网

C# 在Windows 8应用程序中使用MessageBinder.SpecialValue不起作用?

C# 在Windows 8应用程序中使用MessageBinder.SpecialValue不起作用?,c#,mvvm,windows-8,caliburn.micro,C#,Mvvm,Windows 8,Caliburn.micro,我是Caliburn.Micro的新手,所以我希望有人能在这里帮助我:) 我正在尝试在我的Windows 8应用程序中使用MessageBinder.SpecialValue,但无法使其正常工作。我添加了一个新的“$pointerPercentage”,以了解鼠标在元素中的位置百分比(浮动范围在0.0和1.0之间)(对于我的合成器应用程序中的音乐键盘)。其他一切都在正常工作(所以我相信我有Caliburn.Micro-wired) 我已将以下内容添加到我的App.xaml.cs的Configur

我是Caliburn.Micro的新手,所以我希望有人能在这里帮助我:)

我正在尝试在我的Windows 8应用程序中使用MessageBinder.SpecialValue,但无法使其正常工作。我添加了一个新的“$pointerPercentage”,以了解鼠标在元素中的位置百分比(浮动范围在0.0和1.0之间)(对于我的合成器应用程序中的音乐键盘)。其他一切都在正常工作(所以我相信我有Caliburn.Micro-wired)

我已将以下内容添加到我的App.xaml.cs的Configure方法中:

protected override void Configure()
{
    container = new WinRTContainer();
    container.RegisterWinRTServices();

    MessageBinder.SpecialValues.Add("$pointerPercentage", ctx =>
    {
        return 1.0f;
    });
}
然后我在画布元素中的PointerMoved事件中使用它:

<Canvas x:Name="keyCanvas" Background="#338B8BDC"
    cal:Message.Attach="[Event PointerMoved] = [Action UpdateKeyboard($pointerPercentage)]" />

我的ViewModel中的UpdateKeyboard方法确实会被激发(我用调试器打断了它),但传入的参数始终是0.0f(而不是上面SpecialValues代码中设置的1.0f)


我做错了什么?任何帮助都将不胜感激:)。

我发现您的问题:问题在于此行的CM源代码:

else if (MessageBinder.SpecialValues.ContainsKey(parameterText.ToLower()) || char.IsNumber(parameterText[0]))
不确定是否认为源代码有问题-CM将所有
SpecialValues
键按原样处理,但在与
SpecialValues
字典中的键进行比较之前,将任何指定的操作消息特殊参数字符串转换为小写

解决方案是只需将
特殊值
参数键添加为小写

protected override void Configure()
{
    container = new WinRTContainer();
    container.RegisterWinRTServices();

    MessageBinder.SpecialValues.Add("$pointerpercentage", ctx =>
    {
        return 1.0f;
    });
}

我看到你也在CM codeplex网站上发布了这篇文章,我已经回答了——在我看来,这应该在dict中的键和动作消息参数中的键上进行,以防止这种情况发生。(当调用SpecialValues.Add方法以最小化代码影响时,可以这样做)-但这是CM开发人员需要考虑的问题

我发现了您的问题:问题在于这一行的CM源代码:

else if (MessageBinder.SpecialValues.ContainsKey(parameterText.ToLower()) || char.IsNumber(parameterText[0]))
不确定是否认为源代码有问题-CM将所有
SpecialValues
键按原样处理,但在与
SpecialValues
字典中的键进行比较之前,将任何指定的操作消息特殊参数字符串转换为小写

解决方案是只需将
特殊值
参数键添加为小写

protected override void Configure()
{
    container = new WinRTContainer();
    container.RegisterWinRTServices();

    MessageBinder.SpecialValues.Add("$pointerpercentage", ctx =>
    {
        return 1.0f;
    });
}

我看到你也在CM codeplex网站上发布了这篇文章,我已经回答了——在我看来,这应该在dict中的键和动作消息参数中的键上进行,以防止这种情况发生。(当调用SpecialValues.Add方法以最小化代码影响时,可以这样做)-但这是CM开发人员需要考虑的问题

您是否尝试在
Configure
中的匿名方法上粘贴断点?我自己没有使用过
特殊值
但是美元呢,我知道CM使用美元符号表示特殊值,但在配置一个特殊值时是否需要它?让我看看CM源代码……您是否尝试在
Configure
中的匿名方法上粘贴断点?我自己没有使用过
特殊值
但是美元呢,我知道CM使用美元符号表示特殊值,但在配置一个特殊值时是否需要它?让我看看CM源代码。。。