【问题标题】:WinForms : Dynamically add / remove AnchorStyles to / of controlWinForms:动态添加/删除AnchorStyles到/的控制
【发布时间】:2023-04-01 01:48:02
【问题描述】:

我目前正在开发一个编辑器,它可以让用户设计自己的 WinForm 覆盖,至少在某个点上。 因此,我希望用户决定当前选定的 Control 应该具有哪些 AnchorStyles。我希望它由复选框处理。这是我的想法:

如您所见,用户当前选择了一个动态添加的面板,称为 Grid。由右侧的 CheckBoxes 处理,他现在应该能够设置选定的 Controls AnchorStyles。 这是我的问题:我似乎找不到可用的解决方案,将特定的 AnchorStyle 动态添加到现有的 AnchorStyle 中,或者相反,删除 AnchorStyle,但保留其他 AnchorStyle。

我试图让它与......

SelectedControl.Anchor += AnchorStyles.Top;

这根本不起作用。于是我想到了这个……

SelectedControl.Anchor = SelectedControl.Anchor | AnchorStyles.Top

我想它可以工作,但我什至没有测试它,因为我不知道如何删除未选中的 AnchorStyle。 建立一个巨大的if(){} else if(){}... 似乎不是一个好主意:)

我愿意接受任何想法/解决方案。 提前致谢!

【问题讨论】:

  • 您应该为每个复选框处理Checked 事件,然后您可以使用SelectedControl.Anchor &= ~AnchorStyles.Top; 将其删除,例如在清除该框时,或在选中框的情况下添加它。
  • 由于你使用的是 CheckBox,你可以设置SelectedControl.Anchor ^= AnchorStyles.Top 等(当然以AnchorStyles.None 开头)
  • 一个建议,如果您需要在应用程序重新启动时恢复布局:使用类对象来存储定义其布局的控件的属性,这样您就可以轻松地序列化这些列表对象并反序列化它以复制布局,将原始属性重新应用于相应的控件(因此,也存储类型)。
  • 一般来说,我更喜欢显示属性的子集并使用PropertyGrid 来编辑属性。 You can easily achieve it using a custom class containing desired properties which acts as a wrapper around the selected control and each property gets or sets the corresponding property in the selected control.您还可以使用custom type descriptor 并使某些属性可浏览。
  • 查看 Reza Aghaei 发布的内容。对所有 CheckBox 控件使用相同的事件处理程序:该方法简化了所有逻辑。

标签: c# winforms


【解决方案1】:

假设您有四个复选框控件,名为topbottomleftright,您可以使用单一方法处理它们的CheckedChange 事件,并根据控件的检查值。例如:

private void checkBox_CheckedChanged(object sender, EventArgs e)
{
    var values = new[] { top.Checked, bottom.Checked, left.Checked, right.Checked };
    byte[] data = new byte[1];
    new BitArray(values).CopyTo(data, 0);

    selectedControl.Anchor = (AnchorStyles)data[0];
}

注意:AnchorStyles 是一个标志枚举,具有 top=1、bottom=2、left=4 和 right=8。使用上面的代码,我混合了这些标志来创建 AnchorStyles 并分配给控件的 Anchor 属性。

【讨论】:

  • 我相信这篇文章回答了这个问题。如果您在应用/验证解决方案时有任何问题,请告诉我:)
猜你喜欢
  • 2016-08-02
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多