【问题标题】:Multiselect picture gallery with winforms c#带有winforms c#的多选图片库
【发布时间】:2012-05-30 18:38:03
【问题描述】:

我正在尝试使用 winforms 创建一个多选图片库。

目前我创建了一个流程控制面板,可以将图像添加为可选图片框控件。

selectablepicturebox 控件是一个客户用户控件,它是一个空白控件,带有一个图片框和一个位于图片框右上方的复选框。图片框略小,位于用户控件的中心。

点击 selectablepicturebox 控件将打开和关闭背景指示选择。

我想要做的是选择一堆可选择的图片框控件并能够捕获空格键事件以选中和取消选中所选控件中的复选框。

问题是 flowlayoutpanel 永远不知道要捕获空格键事件。

有没有人知道这样做或其他技术?我很乐意使用任何基于 .net 的技术。

谢谢

编辑: 这是code的链接

【问题讨论】:

    标签: c# winforms picturegallery


    【解决方案1】:

    你在尝试 KeyDown 事件吗?

    根据 MSDN,此成员对此控件没有意义。

    阅读herehere。相反,你可以试试PreviewKeyDown

    解决方案:[GitHub 代码库]

    [代码更改] 1. SelectablePictureBox.cs - 注意设置焦点

    public void SetToSelected()
            {
                SelectedCheckBox.Checked = true;
                PictureHolder.Focus();
            }
    
    
    private void PictureHolder_Click(object sender, EventArgs e)
            {
                BackColor = BackColor == Color.Black ? Color.Transparent : Color.Black;
    
                // TODO: Implement multi select features;
    
                if ((Control.ModifierKeys & Keys.Shift) != 0)
                {
                    // Set the end selection index.
                }
                else
                {
                    // Set the start selection index.
                }
    
                PictureHolder.Focus();
            }
    
    
    // subscribe to picture box's PreviewKeyDown & expose a public event
    
     public event PreviewKeyDownEventHandler OnPicBoxKeyDown;
     private void OnPicBoxPrevKeyDown(object sender, PreviewKeyDownEventArgs e)
            {
                if (OnPicBoxKeyDown != null)
                {
                    OnPicBoxKeyDown(sender, e);
                }
            }
    

    [代码更改] 1.FormMain.cs

    private void FormMain_Load(object sender, EventArgs e)
            {
                SensitiveInformation sensitiveInformation = new SensitiveInformation();
                int index = 0;
                //foreach (var photo in Flickr.LoadLatestPhotos(sensitiveInformation.ScreenName))
                for (int i = 0; i < 10; i++)
                {
                    SelectablePictureBox pictureBox = new SelectablePictureBox(index);
    
                    // subscribe to picture box's event
                    pictureBox.OnPicBoxKeyDown += new PreviewKeyDownEventHandler(pictureBox_OnPicBoxKeyDown);
                    PictureGallery.Controls.Add(pictureBox);
                    index++;
                }
            }
    
    // this code does the selection. Query the FLowLayout control which is the 1st one and select all the selected ones
    void pictureBox_OnPicBoxKeyDown(object sender, PreviewKeyDownEventArgs e)
            {
                if (e.KeyCode != Keys.Space) return;
                foreach (SelectablePictureBox item in Controls[0].Controls)
                {
                    if (item.IsHighlighted)
                    {
                        item.SetToSelected();
                    }
                }
            }
    

    【讨论】:

    • 我相信 KeyPress 也有这个信息。 msdn.microsoft.com/en-us/library/…
    • 我已经在上面这个链接中给出了列表-msdn.microsoft.com/en-us/library/…
    • 我目前正在面板中尝试 keydown 事件。但是当我按下空格时,它永远不会被捕获。 flowlayoutpanel 上方和下方的按钮控件将改为激活。 IE。如果当前“光标/选项卡”位于第一个按钮上,即使我单击以选择 flowlayoutpanel 中的图片框,按空格键也只会激活表单中的按钮。
    • 你需要正确处理焦点。 PreviewKeyDown 在 KeyDown 事件之前发生,当一个键被按下时焦点在这个控件上
    • 如何确保重点放在该控件上?如果焦点在控件中的控件上怎么办?
    猜你喜欢
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多