我想从Visual Studio工具箱中的项目中的几个程序集中隐藏所有编写的WPF用户控件。我知道我可以使用[DesignTimeVisible(false)]属性标记UserControls以隐藏每个单独的控件。

是否存在另一种解决方案,以将所有具有一个属性的部件隐藏起来?我不想标记每个新的控件。遗憾的是,该属性不是从其父级继承的,因此我什至无法使用DesignTimeVisible(false)创建basecontrol。

有任何想法吗?

最佳答案

首先,如果应在容器项目中使用此类控件,则可以将其设为internal。您可以根据要求将它们公开。它们也是内部的,也可以在friend assemblies中使用。

无论如何,要减少想要打开/关闭DesignTimeVisible的难度,都可以考虑以下选项:

选项1

作为一种选择,您可以降低打开/关闭DesignTimeVisible属性的难度。您可以用DesignTimeVisible修饰所有类一次,但可以从一个中心点控制其值。

为此,创建一个类来保存设置:

public class MyGlobalSettings
{
    public const bool DesignTimeVisible = false;
}


然后以这种方式装饰控件:

[DesignTimeVisible(MyGlobalSettings.DesignTimeVisible)]
public partial class UserControl1 : UserControl


然后,要打开/关闭工具箱中的显示控件,只需设置DesignTimeVisible。这样,它只是一个单点设置。

选项2

您可以使用T4模板为控件生成局部类的另一种选择。在文件中,您可以具有一个变量,该变量将用作DesignTimeVisible属性的值。然后在T4模板中,用具有指定值的DesignTimeVisible装饰所有部分类。您可以简单地在一个点上更改值。

可以使用代码自动生成类名,但是在此示例中,我使用了静态类名:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>
<#  var designTimeVisibleValue = "false"; #>
using System.Windows.Controls;
using System.ComponentModel;
namespace WpfCustomControlLibrary1
{
    [DesignTimeVisible(<#=designTimeVisibleValue#>)]
    public partial class UserControl1 : UserControl{}

    [DesignTimeVisible(<#=designTimeVisibleValue#>)]
    public partial class UserControl2 : UserControl{}
}


注意

同样如注释中所述,您可以使用Fody,PostSharp,dIHook等工具在构建时修改装配。仅出于此类要求而使用这些库太多了。这样的工具可以带来很多好处,但是仅将其用于这种需求实在是太多了,不是一个好主意。

08-26 16:36