WinForms如何显示FlowDirectionPanel中的特定面板

时间:2016-03-03 14:17:08

标签: c# winforms navigation panel

我有以下FlowDirectionPanel http://prntscr.com/aao6lt因为你可以看到这些是扑克游戏的成就。当你获得一个新成就时,会弹出一个是/否的消息框并且它会询问你如果你想按下“是”并查看新的获取,如果按“是”,我希望能够自动导航到FlowDirectionPanel中包含的新解锁成就,如上图所示。此外,每个成就都包含在另一个面板中,该面板是flowPanel的子项,如果您仔细观察,可以看到它们有一些轮廓边框。我动态创建和添加面板,但它们的名称可以帮助我导航到所需的面板。这就是我创建它们的方式:

        public void PanelForAchievements(Form currentForm, FlowLayoutPanel flp, AchivementRequirements achivement)
    {
        FlowLayoutPanel retFlp = flp;
        string pGetAchivementName = @"pGet" + achivement.Name;
        string lbAchivementName = @"lb" + achivement.Name;
        string lbAchivementRewardName = @"lb" + achivement.Name + @"Reward";
        string cbGetAchivementName = @"cbGet" + achivement.Name;
        string pbAchivementName = @"pb" + achivement.Name;
        var pGetAchivement = new Panel
        {
            Name = pGetAchivementName,
            Size = new Size(retFlp.Width, 100),
            BorderStyle = BorderStyle.FixedSingle,
        };
        currentForm.Controls.Add(pGetAchivement);

        var lbAchivement = new Label
        {
            Name = lbAchivementName,
            Location = new Point(pGetAchivement.Location.X, pGetAchivement.Location.Y),
            Size = new Size(135, 30),
            AutoSize = false,
            BorderStyle = BorderStyle.FixedSingle,
            Font = new Font("Microsoft Sans Serif", 10F, FontStyle.Regular, GraphicsUnit.Point, (byte)0),
            Text = achivement.TitleText,
        };

        var lbAchivementReward = new Label
        {
            Name = lbAchivementRewardName,
            AutoSize = true,
            Top = (pGetAchivement.Height - pGetAchivement.Height) / 2,
            Text = achivement.RewardLabelText,
            TabIndex = 2,
            BorderStyle = BorderStyle.FixedSingle,
            Location = new Point(lbAchivement.Location.X, lbAchivement.Location.Y + lbAchivement.Height + 5)
        };

        var cbGetAchivement = new CheckBox
        {
            Name = cbGetAchivementName,
            AutoCheck = false,
            AutoSize = true,
            Location = new Point(lbAchivement.Location.X + lbAchivement.Width + 10, lbAchivement.Location.Y),
            TabIndex = 1,
            UseVisualStyleBackColor = true
        };
        achivement.IsUnlocked(MainPoker.AllAchievements[achivement.EnumCasted], achivement.Requirement,cbGetAchivement);

        var pbAchivement = new PictureBox
        {
            BorderStyle = BorderStyle.Fixed3D,
            Name = pbAchivementName,
            Dock = DockStyle.Right,
            BackgroundImageLayout = achivement.PictureBoxImageLayout,
            //Location = new Point(pGetAchivement.Right, pGetAchivement.Location.Y),
            Size = new Size(145, 90),
            SizeMode = PictureBoxSizeMode.Zoom,
            TabIndex = 9,
            TabStop = false,
            Image = achivement.PackPreview,
        };

        pGetAchivement.Controls.Add(lbAchivement);
        pGetAchivement.Controls.Add(lbAchivementReward);
        pGetAchivement.Controls.Add(cbGetAchivement);
        pGetAchivement.Controls.Add(pbAchivement);

        retFlp.Controls.Add(pGetAchivement);

        achivement.Title = lbAchivement;
        achivement.RewardLabel = lbAchivementReward;
        achivement.Unlocked = cbGetAchivement;
        achivement.Preview = pbAchivement;
    }

它只是简单的代码,这就是我初始化它们的方式:

    public static RoyalFlush RoyalFlush = new RoyalFlush(1, new Tuple<string, int?>("Royal Card Pack", 100000));
    private readonly CreatePanels _createAchivementPanels = new CreatePanels();
    foreach (var achi in AchivementRequirements.AchivementList)
    {
                    _createAchivementPanels.PanelForAchievements(this, pAchievementsCards, achi);
//im also doing other stuff here..
//pAchivementsCards is the name of the FlowDirectionPanel
    }

现在,当显示yes / no messageBox时,我已经知道哪个成就已解锁,而且我的成就还有如上所示的类public static RoyalFlush RoyalFlush,并且这些类具有属性 - Name,显然包含使用此名称为我从public static RoyalFlush RoyalFlush创建的每个控件创建相应名称的成就名称,例如:

string pGetAchivementName = @"pGet" + achivement.Name;

p代表panel,我只是使用属性achivement.Name得到当前的成就名称,我们最终会得到这样的结果:pRoyalFlush作为我们面板的名称。现在我知道了面板的名称以及正在解锁的成就,我需要浏览我的FlowDirectionPanel并找到特定的面板并将焦点留在那里。我不知道该怎么做我会展示一个例子,上面有我想要的图片,如果它现在还不清楚:

  • 首先我们解锁新成就,我们得到是/否mbox:http://prnt.sc/aaodyr

  • 现在我们按下是按钮,它会将我们重定向到我的新表单并向我们展示成就FlowDirectionPanel:http:/。/。prntscr.com/aaofft此处程序参见&#39; s Full House的成就已经完成,它应该在屏幕中间显示一个漂亮的边框,如下所示:http:./。/ .prntscr.com/aaoh40

我没有声望发布2个以上的链接,所以我不得不在其中添加一些点。 这是我的第一个问题,我的母语不是英语,所以请原谅我犯的任何错误。

1 个答案:

答案 0 :(得分:0)

你可以制作一些foreahc循环,比较名称,然后,当你找到你需要的控件时,将你的flowlayoutpanel滚动到它。例如,我的flowlayoutpanel有4个按钮,只有2个可见,我想滚动到button4:

        foreach (Control c in flowLayoutPanel1.Controls)
        {
            if ((c as Button).Name == "button4")
            {
                (c as Button).Focus();
                flowLayoutPanel1.ScrollControlIntoView(c);
                break;
            }
        }

希望我正确地回答你的问题。