c# - 从工具箱中的程序集隐藏所有 WPF 用户控件

标签 c# .net wpf visual-studio user-controls

我想在 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/

相关文章:

c# - 检测 SQL 集群

c# - 以编程方式分离调试器

c# - Azure blob 文件名中的模式搜索

.net - 使用 open xml sdk 代码,如何调整表格(在 ms word 文档中)以适应页边距?

c# - 为什么在 .NET 生态系统的标准事件模式中没有将 TEventArgs 设为逆变?

c# - 如何在 WPF 窗口中显示屏幕保护程序的预览

wpf - 将大量数据传递到用户控件中

c# - 将 ComboBox 的 SelectedValue 分配给 viewmodel wpf 的字符串属性

C#疑惑,找数据类型

.net - 升级 Team Foundation 服务 (TFS)