所有,我有一个UserCostrol
我最近不得不改变。这一变化要求我引用Parent
表单并使用此表单中的属性。这些引用似乎打破了设计师 - 我收到了错误
“无法将'System.Windows.Forms.Form'类型的对象强制转换为'Project.SettingsForm'”
在Unable to cast object of type 'System.Windows.Forms.Form' to type 'Project.Form1'中描述。
我添加了一个属性来处理Parent
表单的引用,如上面的答案中所述,但现在设计师错误说
“无法将类型为'System.Windows.Forms.Panel'的对象强制转换为'Project.SettingsForm'”。
编译器呻吟的第一行在下面的代码中标有'<-- Here'
public partial class UiSettingFascia : UserControl, ISettingsControl
{
public UiSettingFascia()
{
InitializeComponent();
}
private void UiSettingFascia_Load(object sender, EventArgs e)
{
LoadSettings();
CheckBoxShowTabs.CheckedChanged += Workbook_StateChanged;
CheckBoxShowVirticalScroll.CheckedChanged += Workbook_StateChanged;
CheckBoxShowHorizontolScroll.CheckedChanged += Workbook_StateChanged;
}
public void LoadSettings()
{
UserSettings userSettings = UserSettings.Instance();
...
MainRibbonForm mainRibbonForm = (ControlParent).MainRibbonForm; // <-- Here.
...
}
}
尝试解决初始问题[“无法将'System.Windows.Forms.Form'类型的对象强制转换为'Project.SettingsForm'”]我创建了以下属性< / p>
public SettingsForm ControlParent
{
get { return Parent as SettingsForm; }
}
如何解决此问题[“无法将'System.Windows.Forms.Panel'类型的对象强制转换为'Project.SettingsForm'”],同时保持{的功能{ {1}}?
感谢您的时间。
答案 0 :(得分:1)
看起来你需要编写一些设计时行为的代码。在设计时,UserControl的父实际上可能是Visual Studio(或其某个组件)。这就是Visual Studio能够为您提供在设计时使用控件的GUI的方式 - 它实际上托管了控件;它实际上正在执行。
您可能需要在属性上设置一个属性,该属性使父窗体在设计时给出一些其他行为。另外,我认为UserControls上有一个名为DesignMode
的属性,当控件处于设计模式时也是如此 - 这样,你可以在设计时和运行时给控件不同的行为。 MSDN上有很多关于创建控件和配置设计时与运行时行为的文章。
答案 1 :(得分:1)
public static class DesignTimeHelper
{
public static bool IsInDesignMode
{
get
{
bool isInDesignMode = (
LicenseManager.UsageMode == LicenseUsageMode.Designtime ||
Debugger.IsAttached == true);
if (!isInDesignMode)
{
using (var process = Process.GetCurrentProcess())
{
return process
.ProcessName.ToLowerInvariant()
.Contains("devenv");
}
}
return isInDesignMode;
}
}
}
然后,在您的LoadSettings
方法中:
public void LoadSettings()
{
if (!DesignTimeHelper.IsInDesignMode)
{
var settingsForm = (SettingsForm)this.ParentForm;
}
}