带有枚举的附加DependencyProperty行为怪异



我定义了一个类型为InteractionMode的附加依赖属性(这是一个enum)。它看起来像这样:

[Flags]
public enum InteractionMode
{
    Add,
    AppZone,
    Shortcuts,
    MagnetSelection,
    RowColumnChoosing
}
public static readonly DependencyProperty UserSpaceInteractionMode = DependencyProperty.RegisterAttached(
        "UserSpaceInteractionMode", 
        typeof(InteractionMode),
        typeof(LeapConnectorProperties),
        new FrameworkPropertyMetadata(InteractionMode.None, FrameworkPropertyMetadataOptions.None));
public static InteractionMode GetUserSpaceInteractionMode(DependencyObject element)
{
    if (element == null)
    {
         throw new ArgumentNullException("element");
    }
    return (InteractionMode)element.GetValue(UserSpaceInteractionMode);
}
public static void SetUserSpaceInteractionMode(DependencyObject element, InteractionMode value)
{
    if (element == null)
    {
        throw new ArgumentNullException("element");
    }
    element.SetValue(UserSpaceInteractionMode, value);
}

此外,我使用这个依赖属性在XAML中标记特定的ui元素:

<Grid ns:depProp.UserSpaceInteractionMode="Shortcuts,MagnetSelection">

到目前为止一切正常。不幸的是,当请求这些枚举

InteractionMode iMode = depProp.GetUserSpaceInteractionMode(grid);

我得到一个奇怪的结果。它不会抛出错误,但Visual Studio在调试时显示的枚举与我在XAML中定义的枚举不同(例如AppZone | Shortcuts而不是Shortcuts | MagnetSelection)。

更糟的是,当检查InteractionMode与iMode.hasFlag(flag)的所有enum标志时,结果也与Visual Studio所说的不同(例如,当询问iMode.hasFlag(InteractionMode.Add)时,它说true)

我想我使用枚举有些错误,但我不知道是什么问题。谢谢你的建议!

没有特别做你正在做的事情,我看到过其他类似的标志设置,但是当你允许多个或可能性时,枚举需要是二进制的。

The default is implied as 
public enum InteractionMode
{
    Add = 0,
    AppZone = 1,
    Shortcuts = 2,
    MagnetSelection = 3,
    RowColumnChoosing = 4
}
Change to
public enum InteractionMode
{
    Add = 1,
    AppZone = 2,
    Shortcuts = 4,
    MagnetSelection = 8,
    RowColumnChoosing = 16
}

所以,如果用户在原始选择快捷键和MagnetSelection作为选项,查看二进制

             BINARY
Shortcut 2 = 0010
Magnet   3 = 0011
and you get 
         5 = 0101 binary, so this triggers the "Add" as "1" in the rightmost position.

现在,通过二进制示例更改为快捷方式和magnetSelection,您将得到

Shortcut  4 = 0100
Magnet    8 = 1000
resulting in 12
OR'd     12 = 1100

所以现在测试将正确地识别一个或另一个

相关内容

  • 没有找到相关文章

最新更新