我使用InteractionMode类型定义了一个附加的依赖项属性(它是一个枚举)。看起来像那样:
[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中标记特定的UIElements:
<Grid ns:depProp.UserSpaceInteractionMode="Shortcuts,MagnetSelection">
到目前为止一切都还可以。不幸的是,在要求那些枚举时
InteractionMode iMode = depProp.GetUserSpaceInteractionMode(grid);
我得到一个奇怪的结果。它不会抛出错误,但Visual Studio在调试时显示的枚举与我在XAML中定义的枚举不同(例如AppZone | Shortcuts
而不是Shortcuts | MagnetSelection
)。
当使用iMode.hasFlag(flag)
检查来自InteractionMode的所有枚举标志时,结果与Visual Studio所说的相比也会有所不同(例如,在询问true
时,它会显示iMode.hasFlag(InteractionMode.Add)
我认为我使用的枚举错误,但我不知道这个问题是什么。谢谢你的任何建议!
答案 0 :(得分:2)
如果没有专门完成你正在做的事情,我已经看到了其他类似的标志设置,但是当你通过OR可能性允许多个时,枚举必须是二进制的。
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
}
因此,如果原始用户选择Shortcuts和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
所以现在测试将正确识别其中一个。