2

私は内部に設定したUserControlを持っています:

UserControl x:Class="ClassName"
             x:ClassModifier="internal"

そして、それは一致する .cs ファイルです:

 internal partial class ClassName : UserControl
    {
        public ClassName()
        {
            InitializeComponent();
        }
    }

ここで、ウィンドウでコントロールを使用しようとすると、次のようになります。

 uControls:ClassName x:Name="instanceName" Margin="0,0,8,0" Height="60" VerticalAlignment="Top" Width="60" HorizontalAlignment="Right" MouseLeftButtonUp="instanceName_MouseLeftButtonUp" Cursor="ScrollNW" 

次のようなエラーが表示されます。

The type 'ClassName' cannot have a Name attribute. Value types and types without a default constructor can be used as items within a ResourceDictionary. Line 12 Position 44.

アクセス修飾子をパブリックに変更すると、すべてが期待どおりに機能します。

内部ユーザー コントロールを使用できないのはなぜですか?

4

2 に答える 2

3

これは、WPF のコンパイル モデルが原因であると考えられます。私はこれをメモリから引用しており、それをバックアップするリソースが見つかりませんが、WPF のコンパイルは 2 つのパスで行われると考えています。基本的に、「コードビハインド」部分が最初に中間アセンブリにコンパイルされ、次に XAML が次のようにコンパイルされます。その中間体を参照し、結果が最終的なアセンブリに結合されます。

このため、XAML が参照するクラス/メンバーは、(コンパイラに関する限り) XAML とは別のアセンブリにあるため、パブリックに宣言する必要があります。

編集:プロセスの概要を説明しているMicrosoft リファレンスが見つかりました。特に、私が上で述べたことを裏付けるという点では、次のように述べています。

プロジェクト内の 1 つ以上の XAML ファイルにローカルで定義された型への参照がある場合、一時的な .dll ファイルが生成されるため、マークアップ コンパイルの 2 回目のパスが完了した後に最終的なアプリケーション アセンブリが作成されます。

于 2012-11-06T14:12:12.017 に答える
2

たとえば、XAML で使用されるリソースは、同じアセンブリ内であってもパブリックである必要があることを知っています。それは、彼がリフレクションを使用していて、パブリックなものだけを考慮しているためだと思いますが、内部実装について少し推測しています。

public/internal アクセス修飾子に関する他の問題があったことは知っていますが、今は思い出せません。

UserControl Name プロパティに関して同じ制限が発生する場合があります。

全体として、WPF での私の限られた経験に関して言えば、これは非常に強力なフレームワークですが、残念ながら、途中でいくつかの優れたプラクティスを「忘れる」必要があります。

たとえば、依存関係プロパティを指定するのは面倒です。私は常に、DependencyProperty キーワードが欠けていると感じていました。

于 2012-11-06T14:01:19.473 に答える