我定义了一个类型为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
所以现在测试将正确地识别一个或另一个