我有一个继承usercontrol(view)的控件,并且当你使用usercontrol(一个基本控件)时我正在使用它现在这里是问题,如果我这样做
MessageBox.Show(this.GetType().ToString());
我在运行时和设计时获得不同的消息,在设计时我得到View和i运行时我得到继承视图的xaml文件的类名...
如何在设计时而不是基类中获取继承类类型?
这里有一些代码:
首先我们有视图Class
public class View : UserControl
{
public override void OnApplyTemplate()
{
MessageBox.Show(this.GetType().ToString());
base.OnApplyTemplate();
}
}
然后我们有一个XAML文件:
<local:View x:Class="WpfApplication2.Test"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApplication2"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
</Grid>
</local:View>
现在,如果您在VisualStudio 2010中编译并打开“WpfApplication2.Test”,您将收到一个消息框,显示“WpfApplication2.View”..
但是如果你将Test控件放在你的MainWindow中并按Run(F5)你会得到WpfApplication2.Test ..我想要的是在运行时的设计时间内得到相同的响应......
答案 0 :(得分:3)
嗯,问题是Visual Studio 2010中的XAML设计器没有实例化代码隐藏中声明的实际类。相反,它只实例化其基类。
如果你考虑一下,当你修改你的XAML时,你实际上正在修改代码隐藏中声明的类,因为它是一个部分类,与从XAML创建的另一个部分相结合。因此,设计师无法创建您的类的实例:它仍在创建。
我认为如果不编写与Visual Studio本身交互的代码来询问实际设计的文件是什么,我认为你无法完成你所追求的目标。
您可以使用对DesignerProperties.GetIsInDesignMode()的检查来至少保护您的代码。
请参阅以下链接以获取相关信息:
Troubleshooting WPF Designer load failures
What gets called when the VS 2008 XAML Designer view tries to render the GUI?
答案 1 :(得分:1)
VS2010 Designer(Cider)在设计派生控件时实例化基类的实例。你无能为力。
答案 2 :(得分:1)
Petoj,我认为您应该问自己/描述为什么您想知道该类型的名称以及当它因设计时间不同而导致麻烦的原因。除非你正在与风车作斗争,否则我认为不会得到合理的答案。
更新 - 简单解决方法的伪代码:
if (IsDesignTime)
use this.GetType()
else
use this.GetType().BaseType
更新2:在设计时,无法获取正在设计的后代类的名称。问题应该以不同的方式解决,而不是取决于实际类的名称。
答案 3 :(得分:0)
我还在学习WPF,所以这可能不是你想要的。
在设计时和运行时,this.GetType()。ToString();在消息框中返回“WpfApplication2.View”。
因此在两种模式下都会返回视图。我将声明我对您的代码稍作修改。
namespace WpfApplication2
{
/// <summary>
/// Interaction logic for View.xaml
/// </summary>
public partial class View : UserControl
{
public override void OnApplyTemplate()
{
MessageBox.Show(this.GetType().ToString());
base.OnApplyTemplate();
}
}
}
我将它标记为部分类而不仅仅是类,因为XAML显然是从.cs文件中分离出来的。我不认为这会是问题所在。