【问题标题】:Get resourcename of PictureboxImage获取Picturebox Image的资源名称
【发布时间】:2012-09-13 08:30:23
【问题描述】:

我有一个Picturebox,用户可以从资源文件中选择它的backgroundimage

稍后我想从picturebox 中取出resourcename

我已经试过了:

MessageBox.Show(((PictureBox)sender).BackgroundImage.ToString());

但它给了我图片的格式..没有类似的东西:

MessageBox.Show(((PictureBox)sender).BackgroundImage.Name.ToString());

我已经考虑过在设置图像时将Tag 设置为Pictureboxpicturename...但这很烦人...

那么我怎样才能轻松地在Picturebox 上获得用作backgroundimage 的资源名称?

我想我必须解释整个情况:

我有一个带有很多 raidbuttons 的表格...
如果您选择其中一个按钮并单击面板,
面板将变为所选单选按钮图像...

面板的点击事件:

PanelClick(object obj ,...)
{
    if(radiobuttonApple.checked)
    {
        obj.backgroundimage = resource.apple;
    }

    if(radiobuttonPear.checked)
    {
        obj.backgroundimage = resource.Pear;
    }
}

还有一百多个... 后来我想知道背景图像是哪个资源文件..

有没有这样的:

(如果我将单选按钮命名为资源)

PanelClick(object obj ,...)
{
   obj.backgroundimage = resource[selectedradiobutton.Name]
   obj.tag = selectedradiobutton.Name
}




所以现在我要使用 LINQ:

RadioButton checkedRadioButton = panel1.Controls.OfType<RadioButton>().FirstOrDefault(r => r.Checked);
obj.tag = checkedRadioButton.Text;

所以我只需要知道如何通过名称获取动态资源,例如:

obj.backgroundimage = resource[checkedRadioButton.Text];


并且滥用资源管理器:

var resman = new System.Resources.ResourceManager(
    "RootNamespace.Pictures",
    System.Reflection.Assembly.GetExecutingAssembly()
)
var image = resman.GetPicture("checkedRadioButton.Text");

我希望这会奏效..

【问题讨论】:

  • 我会选择Tag 解决方案。多写一行代码有什么烦人的?它不必直接在PictureBox 上。您可以在初始化时为图像本身设置标签。
  • 我可以通过 Visual Studio 中的资源设计器设置标签吗?我只看到评论栏...
  • 大约有 100 张不同的图片,这就是为什么我不想为每个代码设置标签...
  • 为什么不在将资源分配给图片框之前设置标签?是一条线,不是吗?
  • 如果我能得到资源的名称,这将是一行......嗯,但我想我可以从选定的 Radiobutton 中得到名字......

标签: c# image resources picturebox resource-files


【解决方案1】:

创建一个基于选中的单选按钮返回资源的方法。

例子:

private resource checkResource()
{
    if(radiobuttonApple.checked)
    {
        return resource.apple;
    }

    if(radiobuttonPear.checked)
    {
        return resource.Pear;
    }
}

那你就可以这样使用了

PanelClick(object obj ,...)
{
    obj.backgroundimage = checkResource();
}

PanelClick(object obj ,...)
{
   obj.backgroundimage = checkResource();
   obj.tag = selectedradiobutton.Name
}

编辑:

正如您所说,这种方法可能会根据每个分配的迭代次数而产生不同的问题。为了避免这种情况,同时也考虑到另一种解决方案,您可以使用单个事件来处理所有单选按钮状态更改,如下所示:

首先,创建一个资源变量,以便在单选按钮的状态更改时分配给它。即。

 private Resource bgResource;

 private void radioButton_CheckedChanged(object sender, EventArgs e)
 {
      RadioButton obj = sender as RadioButton;
      bgResource = resman.GetPicture(obj.Tag);
 }

那么任何时候你想改变背景,你都可以简单地说:

obj.BackgroundImage = bgResource;

【讨论】:

  • 这就是我现在的做法......只是没有'obj.tag = selectedradiobutton.Name'
  • 但我想避免 100 if 查询..
    但现在我知道我可以这样做:
    RadioButton checkedRadioButton = panel1.Controls.OfType()。 FirstOrDefault(r => r.Checked); obj.tag = checkRadioButton.Text;
  • 这是一个复杂的过程,运行时执行一条LINQ语句需要更长的时间。相反,将 if 更改为 switch,然后它就不必像 if 语句那样测试所有条件。
  • 但是开关的输入是什么?你怎么得到它? ...是否有类似反向开关的东西,例如: switch(true) ...case radiobutton1.checked ...case radiobutton2.checked ??
  • 哦,我现在明白了,只需为所有单选控件分配一个事件,在该事件中设置 currentResource = 单选按钮的标签。如果您使用的是 Visual Studio,则可以通过选择所有单选按钮、转到事件属性并选择 checkstatechanged 来执行此操作,然后在事件中,您可以拥有RadioButton obj = sender as RadioButtoncurrentResource = obj.tag; 我会尽快更新我的答案以获得完整代码。
猜你喜欢
  • 2021-11-22
  • 1970-01-01
  • 2015-01-30
  • 2015-10-09
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
相关资源
最近更新 更多