2016-10-31 10 views
3

Visual Studio Toolboxの内のプロジェクト内の複数のアセンブリから書かれたWPF UserControlをすべて非表示にしたいとします。私は[DesignTimeVisible(false)]属性を持つUserControlsにフラグを立てて個々のコントロールを隠すことができることを知っています。ツールボックス内のアセンブリからすべてのWPF UserControlsを非表示にする

アセンブリに1つの属性を付けてそれらをすべて非表示にする別のソリューションはありますか?私はそれぞれ新しいコントロールにフラグを立てたくない。悲しいことに、属性は親から継承されないので、DesignTimeVisible(false)でbasecontrolを作成することさえできません。

すべてのアイデア?

+0

使用するVisual Studioのバージョンはどれですか? –

+0

Visual Studio 2012 - 2015 - 20XX – KroaX

+1

私はあなたの質問に答えていない、私はちょうど別のアプローチをお勧めします。 AOPツールを使用して各コントロールにアトリビュートを追加するか、同じ目的のためにILウィービング([Fody](https://github.com/Fody/Fody)など)を使用します。 –

答えて

1

このようなコントロールは、コンテナプロジェクトで使用する必要がある場合はinternalとすることができます。要件に基づいて公開することができます。また、内部であるので、friend assembliesでも同様に使用できます。あなたは難易度を下げることができ、オプションとして

オプション1

とにかく

DesignTimeVisibleのオン/オフの困難さを軽減するには、これらのオプションを検討することができ、あなたが探しているものです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、...ビルド時にアセンブリを変更するそのような要件のためだけにこれらのライブラリを使用することはあまりにも多くなります。そのようなツールは多くの利点を持つことができますが、そのような要件のためにそれらを使用することはあまりにも多くのことではありません。

+0

あなたの努力のおかげでレザ。 true/falseの中央処理は良い点ですが、まだ各コントロールの装飾に余分な魅力がありますが、私はそれらのうちの1つを表示したくないことを知っています。( – KroaX

+0

他の2つの解決策があります。** 1 )**私が答案で提案した2番目のオプションのように、t4テンプレートを使用しますが、t4は自動的にすべての部分クラスを生成します。 ** 2)** Fody、PostSharp、dIHookなどのツールを使用して、ビルド時にアセンブリをモチベーションします。私はそのような要件のためだけに後者を使用することを好まない。そのようなツールには多くのメリットがありますが、そのような要件のためだけに使うのは良い考えではありません。しかし、t4オプションはここではIMOに適しています。 –

+0

確かに私たちのためにタスクを自動的に行うt4を使うと良い解決策になるでしょうが、もし私があなただったら私は現在の答えの最初のオプションを選ぶでしょう、あなたが書いた文字)とにかく、これらのクラス名を自動的に生成するようにt4ファイルを変更します。 –

1

たぶん私は遅れていますが、場合:あなたのコントロールアセンブリがあなたのコントロールアセンブリのプロジェクトは、あなたがして

で作業しているソリューションではありませんGAC

  • に登録していない

    1. WPF Designer Extensibilityを使用できます。実際には、ビジュアルスタジオのWPFデザイナを属性を使用して拡張することができます。

      必要な属性はToolboxBrowsableAttributeです。このフレームワークのより重要な機能は、コントロールの属性を別のアセンブリ(デザインアセンブリと呼ばれる)で定義できるということです。

      それでは、これらは私たちのカスタムコントロールしていると仮定してみましょう:

      namespace CustomControls 
      { 
          public class CustomTextBox : TextBox 
          { 
          } 
      
          public class CustomButton : Button 
          { 
          } 
      
          public class CustomComboBox : ComboBox 
          { 
          } 
      } 
      

      カスタムコントロールがCustomControls.dllという名前のアセンブリです。各コントロールに必要な属性を追加するには、CustomControls.Design.dllという新しいアセンブリを作成する必要があります。この新しいアセンブリ参照する必要があります:

      • PresentationCore
      • PresentationFramework
      • System.Xaml
      • WindowsBase
      • Microsoft.Windows.Design.Extensibility
      • Microsoft.Windows.Design.Interaction

      AssemblyInfoに次のコード行を追加します。

      [assembly: ProvideMetadata(typeof(CustomControls.Design.Metadata))] 
      

      この属性は、どのクラスがデザイナの属性を提供するかを示します。 それでは、Metadataクラスのコードを見てみましょう。このように

      namespace CustomControls.Design 
      { 
          public class Metadata : IProvideAttributeTable 
          { 
           AttributeTable IProvideAttributeTable.AttributeTable 
           { 
            get 
            { 
             AttributeTableBuilder builder = new AttributeTableBuilder(); 
             Assembly assembly = Assembly.GetAssembly(typeof(CustomControls.CustomButton)); 
      
             foreach (Type objectType in assembly.GetTypes()) 
             { 
              if (objectType.IsPublic && typeof(FrameworkElement).IsAssignableFrom(objectType)) 
              { 
               builder.AddCustomAttributes(objectType, 
                ToolboxBrowsableAttribute.No); 
              } 
             } 
      
             return builder.CreateTable(); 
            } 
           } 
          } 
      } 
      

      私は1つずつコントロール1を飾るの必要がなく、FrameworkElementクラスを拡張CustomControlアセンブリの各パブリックオブジェクトにToolboxBrowsable属性を追加しています。

      CustomControls.Design.dllは、CustomControls.dllと同じフォルダにする必要があります。

      有用な情報hereがあります(このコードでも若干異なる引数があります)。

      条件:条件1と条件2がでない場合は、両方ともが満たされていないと、この方法は機能せず、確かにReza Aghaeiのソリューションが適しています。

      私はそれが助けてくれることを願っています。

  • 関連する問題