用户可从设置文件(物理和资源)中选择背景图像

本文关键字:资源 选择 图像 背景 设置 文件 用户 | 更新日期: 2023-09-27 18:28:40

我有一个WinForms应用程序,它有一个单选按钮,可以更改表单的背景图像,并将该背景图像的位置保存到文本文件中,这样用户每次运行应用程序时都会加载所选的背景。

现在,这些背景图像需要位于用户的/(USERNAME)/My Documents/Application Name/Skins/Default/文件夹中。

我希望应用程序做如下操作:

用户可以选择位于/(USERNAME)/My Documents/Application Name/Skins/Custom/文件夹中的"自定义"皮肤。

还可以从"默认"皮肤中进行选择,但这些皮肤位于项目的资源中。我的问题是:我可以从设置文件中读取和写入自定义皮肤的物理位置,但我不知道如何使用这种方法添加从内置项目资源位置选择背景的功能,并将其保存到设置文件中。

这是我现在用于物理位置的代码:

    private void DefaultThemeButton_CheckedChanged(object sender, EventArgs e)
    {
        string SettingsPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDoc‌​uments), "Application Name", "Settings.cfg");
        string currentBackgroundImage = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDoc‌​uments), "Application", "Skins", "Default", "DefaultBackground.png");
        var lines = System.IO.File.ReadAllLines(SettingsPath);
        lines[7] = (currentBackgroundImage);
        System.IO.File.WriteAllLines(SettingsPath, lines);
        MainForm.BackgroundImage = Image.FromFile(System.IO.File.ReadLines(SettingsPath).Skip(7).Take(1).First()); ;

我希望能够完成这样的事情:

// USER SELECTS DEFAULT BACKGROUND
    private void DefaultThemeButton_CheckedChanged(object sender, EventArgs e)
    {
        string SettingsPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDoc‌​uments), "Application Name", "Settings.cfg");
        string currentBackgroundImage = ((System.Drawing.Image)(Properties.Resources.DefaultBackground))  // THIS IS THE PART I'M STUCK ON
        var lines = System.IO.File.ReadAllLines(SettingsPath);
        lines[7] = (currentBackgroundImage);
        System.IO.File.WriteAllLines(SettingsPath, lines);
        MainForm.BackgroundImage = Image.FromFile(System.IO.File.ReadLines(SettingsPath).Skip(7).Take(1).First()); ;
// USER SELECTS CUSTOM BACKGROUND
    private void CustomThemeButton_CheckedChanged(object sender, EventArgs e)
    {
        string SettingsPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDoc‌​uments), "Application Name", "Settings.cfg");
        string currentBackgroundImage = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDoc‌​uments), "Application", "Skins", "Custom", "Background.png");
        var lines = System.IO.File.ReadAllLines(SettingsPath);
        lines[7] = (currentBackgroundImage);
        System.IO.File.WriteAllLines(SettingsPath, lines);
        MainForm.BackgroundImage = Image.FromFile(System.IO.File.ReadLines(SettingsPath).Skip(7).Take(1).First()); ;

有没有一种方法可以像读取物理位置一样读取资源位置,而不必将文件实际放在物理文件夹中?

用户可从设置文件(物理和资源)中选择背景图像

this.Control.BackgroundImage = Project.Properties.Resources.resourceName;

this.Control.BackgroundImage =   ((System.Drawing.Image)(resources.GetObject("Resource.Image")));

因此,有了这个,你就不需要在任何地方保存它的路径,因为你已经在资源中拥有了它。。这就是为什么我认为不需要拯救道路。。。您所需要做的就是以某种方式告诉您的应用程序通过文本文件加载资源或外部文件中的一个。

我已经通过改变背景的选择方式来解决我的问题。在我的主题选择表单中,用户选择的主题会作为一个由主题名称组成的简单字符串写入我的Settings.cfg文件。

然后,根据选择的主题,从资源或主题的物理位置加载主题。

主题选择形式:

    private void DEFAULTTHEME_Click(object sender, EventArgs e)
    {            
        string SettingsPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDoc‌​uments), "Application Name", "Settings.cfg");            
        string SelectedTheme = "Default Theme"; //THIS GETS WRITTEN TO THE SETTINGS FILE           
        var lines = System.IO.File.ReadAllLines(SettingsPath);
        lines[7] = (SelectedTheme);
        System.IO.File.WriteAllLines(SettingsPath, lines);
        MainForm.BackgroundImage = Properties.Resources.DefaultBackground;
    }
    private void LIGHTTHEME_Click(object sender, EventArgs e)
    {            
        string SettingsPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDoc‌​uments), "Application Name", "Settings.cfg");            
        string SelectedTheme = "Light Theme"; //THIS GETS WRITTEN TO THE SETTINGS FILE           
        var lines = System.IO.File.ReadAllLines(SettingsPath);
        lines[7] = (SelectedTheme);
        System.IO.File.WriteAllLines(SettingsPath, lines);
        MainForm.BackgroundImage = Properties.Resources.LightBackground;
    }
    private void CUSTOMTHEME_Click(object sender, EventArgs e)
    {
        string SettingsPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDoc‌​uments), "Application Name", "Settings.cfg");
        string CustomBackground = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDoc‌​uments), "Application Name", "Skins", "Custom", "Background.png"); //THIS IS SO MY APPLICATION KNOWS THE LOCATION OF THE CUSTOM BACKGROUND IMAGE
        string SelectedTheme = "Custom Theme"; //THIS GETS WRITTEN TO THE SETTINGS FILE
        var lines = System.IO.File.ReadAllLines(SettingsPath);
        lines[7] = (SelectedTheme);
        System.IO.File.WriteAllLines(SettingsPath, lines);
        MainForm.BackgroundImage = Image.FromFile(CustomBackground);
    }

当我的主表单加载时,它会在第8行检查设置文件的内容,并将其转换为字符串(所选主题的名称)。然后表单根据字符串的内容决定显示哪个背景图像:

private void Form1_Load(object sender, EventArgs e)   
{
 string SettingsPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDoc‌​uments), "Application Name", "Settings.cfg");
 string CustomBackground = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDoc‌​uments), "Application Name", "Skins", "Custom", "Background.png");
 string SelectedTheme = System.IO.File.ReadLines(SettingsPath).Skip(7).Take(1).First();
//LOAD THEME
        if (SelectedTheme.Equals("Default Theme"))
        {
            this.BackgroundImage = Properties.Resources.DefaultBackground;
        }
        else if (SelectedTheme.Equals("Light Theme"))
        {
            this.BackgroundImage = Properties.Resources.LightBackground;
        }
        else if (SelectedTheme.Equals("Custom Theme"))
            this.BackgroundImage = Image.FromFile(CustomBackground);
        else
        {
            this.BackgroundImage = Properties.Resources.DefaultBackground;
        }
}

我不确定这是否是实现这一目标的理想方法,因为我对C#非常陌生,但这种方法对我的应用程序非常有效。