我想从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等工具在构建时修改装配。仅出于此类要求而使用这些库太多了。这样的工具可以带来很多好处,但是仅将其用于这种需求实在是太多了,不是一个好主意。