2

こんにちは私はここにある情報に基づいていくつかのサブクラス化されたユーザーコントロールを作成しました; http://csharpsimplified.wordpress.com/2011/09/21/subclassing-wpf-user-control/しかし、問題が発生しています。

これが、TestUserControlプロジェクトで開催された私の基本クラスです。

namespace TestUserControl
{
    public class BaseDataGridControl : UserControl
    {
        protected BaseDataGridControl()
        {
        }
    }
}

これが私の具体的なクラスです;

<view:BaseDataGridControl x:Class="TestUserControl.Concrete"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:view="clr-namespace:TestUserControl"      
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Button Height="20" Width="60" Margin="12,12,228,268" />
    </Grid>
</view:BaseDataGridControl>

そして、この制御コードの背後は次のようになります;

public partial class Concrete : BaseDataGridControl
{
    public Concrete()
    {
        InitializeComponent();
    }
}

同じTestUserControlプロジェクトのウィンドウに具象クラスを問題なくドロップできます。

<Window x:Class="TestUserControl.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:TestUserControl">
    <Grid>
        <my:Concrete HorizontalAlignment="Left" Margin="88,39,0,0" x:Name="concrete1" VerticalAlignment="Top" />
    </Grid>
</Window>

これはすべて正常に機能します。

問題は、別のプロジェクトで具象クラスを使おうとしたときです。

別のプロジェクト(WPFApplication1)を作成し、具象クラスに基づいてクラスを作成するとします。

namespace WpfApplication1
{
    public class SubClass : Concrete
    {
    }
}

これをWPFApplication1プロジェクトのウィンドウにドロップしようとすると、;が表示されます。

「コレクションが変更されたため、列挙子は無効です」

XAML経由で追加しようとすると、

'コンポーネント'WpfApplication1.SubClass'には、URI'/TestUserControl;component/concrete.xaml'で識別されるリソースがありません。

エラーメッセージ。

WPFApplication1プロジェクトには、TestUserControlプロジェクトへの参照があります。

ユーザーコントロールが定義されたプロジェクト内でこれが機能する理由を誰かが知っていますが、別のプロジェクトでサブクラス化しようとするとすぐに失敗しますか?

私はこれをVS2010とVS11ベータで試しましたが、同じ悪い結果になりました。

私はリフレクションを使用しておらず、クラスのコンストラクターのコレクションにアクセスしていません。コードはここに表示されているものです。

この問題を実証するテストプロジェクトがあります。

ありがとう ....

4

1 に答える 1

0

同様の問題に遭遇しました。ベース UI を含むプロジェクトがあり、いくつかの項目はユーザー コントロールです。(このプロジェクトを「BaseUI」と呼びます)。私の 2 番目のプロジェクト (「SubProj」と呼びます) では、その参照を追加して Visual Studio の xaml に追加することはできますが、Blend を使用して変更を確認することはできません。そして今では、より複雑な編集には使用できません。

「[コンポーネント名がここに入る] は名前空間 [参照された名前空間] に存在しません」というエラーが発生します。

私が見つけた修正により、おそらくサブプロジェクトでも継承できるようになります。

参照されているアセンブリから直接クラスを使用しようとする代わりに、リンクを使用して現在のアセンブリにコードを追加できます。リンクにより、コントロールは既存のプロジェクトにあるかのように動作しますが、コードは基本プロジェクトからのものです。これを変更すると、すべてのリンクに影響します。プロジェクトをまたぐという問題なしに、それをローカルに継承できるはずです。

方法は次のとおりです。

  1. 「BaseUI」プロジェクトでベース コントロールを作成します。
  2. 「SubProj」を右クリックして、既存のアイテムを追加します
  3. 必要なユーザー コントロールの "BaseUI" プロジェクトから .xaml ファイルを探し出します。
  4. [追加] ボタンの横にある矢印をクリックし、[リンクとして追加] を選択します。
于 2015-02-10T06:07:13.787 に答える