C#UserControl可见属性未更改
ucFollow是一个自定义用户控件,没有什么特别之处。上面的代码打印出来:C#UserControl可见属性未更改,c#,winforms,user-controls,C#,Winforms,User Controls,ucFollow是一个自定义用户控件,没有什么特别之处。上面的代码打印出来: Debug.WriteLine(ucFollow.Visible); ucFollow.Visible = true; Debug.WriteLine(ucFollow.Visible); 最糟糕的是,这个确实切换了UserControl的实际可见性(即,一旦调用了这个代码,ucFollow就出现了),但似乎Visible属性并没有。。。嗯,在后端可见,并且不反映更改,即使UI本身也反映更改 我甚至不知道从哪里开始解
Debug.WriteLine(ucFollow.Visible);
ucFollow.Visible = true;
Debug.WriteLine(ucFollow.Visible);
最糟糕的是,这个确实切换了UserControl的实际可见性(即,一旦调用了这个代码,ucFollow就出现了),但似乎Visible属性并没有。。。嗯,在后端可见,并且不反映更改,即使UI本身也反映更改
我甚至不知道从哪里开始解决这个问题。有人知道是什么导致了这种疯狂吗
编辑:这是Visual Studio 2010中的标准C#WinForm。假设属性和字段是相同的,这是一种危险。当然,它们在概念上非常相似(这就是重点),但它们在机械上明显不同。看看
ucFollow.Visible=true
实际上做了什么:
False
False
(代码由ILSpy提供。)
你的答案就在那令人痛苦的逻辑迷宫中。我没有打破C!:)
原来凶手是有形财产。在Form.Visible设置为true之前,无论发生什么情况,表单上的任何和所有控件都将不可见(Visible=false)
但是,您仍然可以设置可见属性-在Form.Visible属性设置为true之前,这些属性不会生效
换句话说,当我调用ucFollow.Visible=true
时,我的程序确实在注册它-但是,在代码中,ucFollow的父窗体.Visible仍然是false。因此,调试器和我的print语句都识别出,“嘿,这个控件的父窗体仍然不可见,所以这个控件不可见。句点。”
表单一出现,所有的更改就生效了,一切都很顺利
这个故事的寓意是:不要依赖控件的可见性属性,除非包含它们的窗体已经可见并正在运行。罪魁祸首是控件的可见性属性实际上是一个属性(使用get;set;)该集合将分配给内部m#u Visible成员,但get将检查所有父控件,并且只有当所有父控件都有m#u Visible==true时才会返回true如果你破坏了C#I'm afriad,你必须修复它。是否存在控件层次结构?如果控件由不可见的父控件包含,则将visible指定为true并不一定表示该控件可见。看到这种行为可能有很多原因,我不会直接得出c#bug结论。请提供一个简单的可复制的例子。@dramallama我们当然需要一个可复制的例子。我们没有您的代码库,只能猜测。运行此代码时表单是否可见(即此代码是否在form.Load事件中运行?)。如果控件在物理上不可见,它将返回false,直到它出现。我感觉我的解决方案可以与前面提到的逻辑迷宫中的某个东西联系起来,但今天是星期五,我懒得去找它。:)如果您想知道控件是否可见(如果父控件可见),您可以查看我的问题以获得解决方案您可以将其标记为答案,这样做完全可以。控件可见性(在设计模式下)的另一个奇特行为是,当您有一个用户控件时,您没有在InitializeComponent()中声明它。。(无论什么原因)。。。如果打开表单,则控件不会显示,也不会列在控件的Properties dropdownlist中。
protected virtual void SetVisibleCore(bool value)
{
try
{
HandleCollector.SuspendCollect();
if (this.GetVisibleCore() != value)
{
if (!value)
{
this.SelectNextIfFocused();
}
bool flag = false;
if (this.GetTopLevel())
{
if (this.IsHandleCreated || value)
{
SafeNativeMethods.ShowWindow(new HandleRef(this, this.Handle), value ? this.ShowParams : 0);
}
}
else
{
if (this.IsHandleCreated || (value && this.parent != null && this.parent.Created))
{
this.SetState(2, value);
flag = true;
try
{
if (value)
{
this.CreateControl();
}
SafeNativeMethods.SetWindowPos(new HandleRef(this.window, this.Handle), NativeMethods.NullHandleRef, 0, 0, 0, 0, 23 | (value ? 64 : 128));
}
catch
{
this.SetState(2, !value);
throw;
}
}
}
if (this.GetVisibleCore() != value)
{
this.SetState(2, value);
flag = true;
}
if (flag)
{
using (new LayoutTransaction(this.parent, this, PropertyNames.Visible))
{
this.OnVisibleChanged(EventArgs.Empty);
}
}
this.UpdateRoot();
}
else
{
if (this.GetState(2) || value || !this.IsHandleCreated || SafeNativeMethods.IsWindowVisible(new HandleRef(this, this.Handle)))
{
this.SetState(2, value);
if (this.IsHandleCreated)
{
SafeNativeMethods.SetWindowPos(new HandleRef(this.window, this.Handle), NativeMethods.NullHandleRef, 0, 0, 0, 0, 23 | (value ? 64 : 128));
}
}
}
}
finally
{
HandleCollector.ResumeCollect();
}
}