Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#-如何更改我所有表单上的按钮图像_C#_Winforms - Fatal编程技术网

c#-如何更改我所有表单上的按钮图像

c#-如何更改我所有表单上的按钮图像,c#,winforms,C#,Winforms,我有三个表单,其中一个表单上有一个组合框,当组合框的选定值发生变化时,该组合框应该会改变我所有运行表单上的图标和其他表单上按钮的图像 请注意,当涉及到更改图标时,问题已经解决,但我需要更改按钮图像的解决方案。我只在一个表单(组合框所在的位置)上实现了这一点。我也不知道如何在其他表单上定制按钮 我试过这样做: private void combo_Theme_SelectedValueChanged(object sender, EventArgs e) { Mai

我有三个表单,其中一个表单上有一个组合框,当组合框的选定值发生变化时,该组合框应该会改变我所有运行表单上的图标和其他表单上按钮的图像

请注意,当涉及到更改图标时,问题已经解决,但我需要更改按钮图像的解决方案。我只在一个表单(组合框所在的位置)上实现了这一点。我也不知道如何在其他表单上定制按钮

我试过这样做:

    private void combo_Theme_SelectedValueChanged(object sender, EventArgs e)
    {
        Main f1 = new Main();
        if (combo_Theme.Text == "Purple")
        {
            foreach (var form in Application.OpenForms.Cast<Form>())
            {
                form.Icon = Properties.Resources.Purple;
                f1.btn_Exit.Image = Properties.Resources.EXIT_purple;
            }
        }
private void combo\u Theme\u SelectedValueChanged(对象发送方,事件参数e)
{
Main f1=新的Main();
如果(combo_Theme.Text==“紫色”)
{
foreach(Application.OpenForms.Cast()中的var form)
{
form.Icon=Properties.Resources.Purple;
f1.btn_Exit.Image=Properties.Resources.Exit_紫色;
}
}
……但没有成功

基本上,我现在被卡住了,因为上面的代码不适合我


有什么想法吗?

您应该通过使用某种方法实现一些接口来重新设计表单,调用该方法实际上会更新特定表单上按钮的图像。这样,您就不必在每个控件之间循环(嵌套关系中)然后检查每个按钮。但是,如果您的表单没有复杂的嵌套关系,并且按钮的数量很少,我们可以使用以下代码,事实上,当您在具有多个嵌套容器的表单上有数千个控件时,此代码仍然可以正常工作(响应速度足够快):

public IEnumerable GetAllButtons(表单){
堆栈控件=新堆栈();
控件。推送(窗体);
而(controls.Count>0){
var control=controls.Pop();
foreach(control.Controls中的var c){
如果(c为按钮),则返回c;
控制。推(c);
}
}
}
//现在在代码中使用该方法,如下所示:
私有无效组合\u主题\u所选值已更改(对象发送方,事件参数e)
{
Main f1=新的Main();
如果(combo_Theme.Text==“紫色”)
{
foreach(Application.OpenForms.Cast()中的var form)
{
form.Icon=Properties.Resources.Purple;
f1.btn_Exit.Image=Properties.Resources.Exit_紫色;
//循环浏览当前窗体上的每个按钮
foreach(GetAllButtons(表单)中的var按钮){
//你的代码在这里
button.Image=Properties.Resources.EXIT_紫色;
}
}
}
//...
}

你说“它不工作”是什么意思?为什么你在foreach循环内更改btn_Exit.Image?我在循环外尝试过它也不工作。所谓“不工作”,我的意思是什么都没有发生。在窗体图标或按钮图标中没有发生任何事情?要更改所有按钮(在每个窗体内)的按钮图像,你必须在窗体控件之间循环(以递归方式)选择类型()。这里有一个类似的问题。正如我所说,它可以完美地更改图标,但问题是我不能更改按钮,除了一个与用于更改的组合框位置相同的按钮。无论如何,我对c#还是比较陌生的,所以如果你能进一步解释这一点,我将非常感激,因为我自己无法更改。比ks。设想使用form.Controls.OfType()循环每个按钮。这将适用于作为表单子级的按钮(例如,如果它们位于面板内,则不起作用)。这就是为什么我说必须使其递归(在此处搜索).然后你必须了解哪个按钮必须更新…也就是说我不会这样做,我会让每个表单对全局事件“ThemeChanged”作出反应。谢谢你的回答。我的表单非常简单,用户Precious Tijesunimi提供的代码对我来说很好。但是,我知道你从哪里来,如果我的表单更复杂,你的代码肯定会是更好的解决方案。@ExintaEnea是的,即使你的表单有数百个带有嵌套容器的控件,它仍然可以工作。
public IEnumerable<Button> GetAllButtons(Form form){
  Stack<Control> controls = new Stack<Control>();
  controls.Push(form);
  while(controls.Count > 0){
    var control = controls.Pop();
    foreach(var c in control.Controls){
      if(c is Button) yield return c;
      controls.Push(c);
    }
  }
}
//now use that method in your code like this:
private void combo_Theme_SelectedValueChanged(object sender, EventArgs e)
{
    Main f1 = new Main();
    if (combo_Theme.Text == "Purple")
    {
        foreach (var form in Application.OpenForms.Cast<Form>())
        {
            form.Icon = Properties.Resources.Purple;
            f1.btn_Exit.Image = Properties.Resources.EXIT_purple;
            //looping through each button on the current form
            foreach(var button in GetAllButtons(form)){
              //your code here
              button.Image = Properties.Resources.EXIT_purple;
            }
        }
    }
    //...
}