C# WPF在设计时获取类型?

C# WPF在设计时获取类型?,c#,xaml,design-time,C#,Xaml,Design Time,我有一个继承usercontrol(view)的控件,我使用它就像使用usercontrol(base控件)一样,如果我这样做了,问题就出在这里 MessageBox.Show(this.GetType().ToString()); 我在运行时和设计时得到不同的消息,在设计时得到视图,在运行时得到继承视图的xaml文件的类名 如何在设计时获得继承类类型而不是基类 下面是一些代码: 首先,我们要看风景课 public class View : UserControl { public o

我有一个继承usercontrol(view)的控件,我使用它就像使用usercontrol(base控件)一样,如果我这样做了,问题就出在这里

MessageBox.Show(this.GetType().ToString());
我在运行时和设计时得到不同的消息,在设计时得到视图,在运行时得到继承视图的xaml文件的类名

如何在设计时获得继承类类型而不是基类

下面是一些代码:

首先,我们要看风景课

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>

现在,如果您在VisualStudio2010中编译并打开“WpfApplication2.Test”,您将看到一个消息框,上面写着“WpfApplication2.View”


但是,如果将测试控件放在主窗口中并按Run(F5),则会得到WpfApplication2.Test。。我想要的是在设计时得到与运行时相同的响应…

我仍在学习WPF,所以这可能不是您想要的

在设计时和运行时,这个.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();
        }
    }
}
命名空间WpfApplication2
{
/// 
///View.xaml的交互逻辑
/// 
公共部分类视图:UserControl
{
应用程序模板()上的公共重写无效
{
Show(this.GetType().ToString());
base.OnApplyTemplate();
}
}
}

我将它标记为部分类,而不仅仅是类,因为XAML显然是从.cs文件中分离出来的。但是我认为这不是问题。

问题在于Visual Studio 2010中的XAML设计器没有实例化代码中声明的实际类。相反,它只实例化它的基类

如果您仔细想想,在修改XAML时,您实际上是在修改代码隐藏中声明的类,因为它是一个部分类,与从XAML创建的另一部分组合在一起。因此,设计器无法创建类的实例:它仍在创建中

我认为,如果不编写与VisualStudio本身交互的代码来询问实际设计的是什么文件,您就无法完成所要完成的任务

至少可以通过检查DesignerProperties.GetIsInDesignMode()来保护代码

有关某些相关信息,请参见以下链接:


在设计派生控件时,VS2010设计器(Cider)正在实例化基类的实例。你对此无能为力。

Petoj,我想你应该问问自己/描述一下为什么你想知道类型的名称,以及当它在设计时不同时为什么会引起麻烦。除非你在和风车搏斗,在我看来,你不会得到一个合理的答案

更新-简单解决方案的伪代码:

if (IsDesignTime)
   use this.GetType()
else
   use this.GetType().BaseType

更新2:在设计时,无法获取正在设计的子类的名称。这个问题可能应该以不同的方式解决,而不取决于实际类的名称。

我不完全理解您的情况。您可以发布一个控件的XAML片段和一些上下文来说明您在哪里进行这个消息框调用吗?也许进一步解释一下你最终想要实现的目标会有所帮助?也许有一种更有效的方法来做你最终想要做的事情。什么是“设计时间”?你的意思是当你在IDE中将鼠标移到它上面时,它会显示“视图”吗?编辑它以解释更多内容并添加一些代码。我复制了你的项目,但你是否注意到,在设计时,如果你进入显示测试控件的窗口,窗口会提示“测试”?是的,但如果你在设计模式下打开测试控件,它会在他的问题中显示“视图”,类“View”是类“Test”的基类。类“Test”是Test.xaml的代码隐藏中定义的部分类。没有问题,值得一试。我记得VisualStudio的DesignMode属性的问题在嵌套视图时有些无用@迈克·申克,谢谢你的澄清。在重新阅读代码时,没有看到test inherit from view,这让我很困惑。编辑:Partial只在一个类上工作(不能有一个类对多个类进行了Partial),并且Partial只在同一个程序集中…我不想更改什么,我只想知道类型或类型的名称,这不必由GetType完成,它可以是任何其他方法或属性。我现在有一个视图和ViewModels(或其类型)的列表。当我在设计时,我想将DataContext设置为viewmodel的正确类型,但为了能够做到这一点,我需要该类型,以便比较这些类型。@Petoj用合理的方法更新了我的答案(IMHO)变通方法。@Petoj再次阅读您的问题。现在我明白了:您需要后代类的名称。正如Omer Mor在回答中指出的,可能没有办法得到它-事实上,Microsoft技术中的可视化设计器确实实例化了基类,而不是实际设计的后代类。因此,在您的cas中e、 通过以完全不同的方式知道类型的名称来解决您试图解决的问题可能会更快。