WinForms 如何从 FlowDirectionPanel 显示特定面板

本文关键字:显示 FlowDirectionPanel WinForms | 更新日期: 2023-09-27 18:37:23

我有以下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
    }

现在,当显示是/否消息框时,我已经知道哪个成就已解锁,并且我的成就具有如上所示的类public static RoyalFlush RoyalFlush并且这些类具有属性 - Name显然包含成就的名称 im 使用此名称为我从public static RoyalFlush RoyalFlush创建的每个控件创建各自的名称,例如:

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

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

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

  • 现在我们按"是"按钮,它将重定向到我的新表单,并向我们显示成就FlowDirectionPanel:h.t.t.p.:/。/.prntscr.com/aaofft 在这里,程序看到《浪漫满屋》的成就已经完成,它应该在屏幕中间显示它,边框很好,就像这样:h.t.t.p.:././.prntscr.com/aaoh40

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

WinForms 如何从 FlowDirectionPanel 显示特定面板

您可以创建一些 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;
            }
        }

希望我和你的问题正确。