我有以下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个以上的链接,所以我不得不在其中添加一些点。 这是我的第一个问题,我的母语不是英语,所以请原谅我犯的任何错误。
答案 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;
}
}
希望我正确地回答你的问题。