我想在 Visual Studio 工具箱 中的项目中的多个程序集中隐藏所有已编写的 WPF 用户控件。我知道我可以使用 [DesignTimeVisible(false)]
属性标记 UserControls 以隐藏每个单独的控件。
是否有另一种解决方案可以将它们全部隐藏在程序集上的一个属性中?我不想标记每个新控件。遗憾的是,该属性不是从其父级继承的,因此我什至无法使用 DesignTimeVisible(false) 创建基本控件。
有什么想法吗?
最佳答案
作为首选,如果这些控件应该在容器项目中可见,则它们可以是内部
。您可以根据需要将它们公开。同样是内部的,它们可以用于 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 等工具在构建时修改程序集。仅仅为了这样的需求而使用这些库是太多了。这样的工具可以有很多好处,但是仅仅为了满足这样的需求而使用它们太过分了,这不是一个好主意。
关于c# - 从工具箱中的程序集隐藏所有 WPF 用户控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40342094/