コンポーネントのラインナップ:エラー用カスタム制御のItemTemplateの他のカスタム制御

StackOverflow https://stackoverflow.com/questions/1585737

質問

いカスタム制御ライブラリがって複数のカスタムコントロールを使用している私のメインのアプリケーション。私は簡単なカスタムを制御することで、ユーザーを選択ペン厚さの価値観からのコンボボックス.今、新しいカスタム制御に基づくlistboxして大事にしていきたいと思い、ペンの厚さをコンボボックスカスタムコントロールのItemTemplate.

どんどんこのエラー:

"を生成できないインスタンスの"LineThicknessComboBox"で定義され組み立てCustomControls...例外がスローされる対象の呼び出し.エラーオブジェクト"10_T"のマークアップファイル'CustomControls;コンポーネント/テーマ/CustomListBox.一般的です。ポ'.

こちらではの発想、コードの背後にLineThicknessComboBox:

namespace CustomControls
{
    public class LineThicknessComboBox : ComboBox
    {
        public LineThicknessComboBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(LineThicknessComboBox)
                        , new FrameworkPropertyMetadata(typeof(LineThicknessComboBox)));

        }
    }
}

やLineThicknessCombobox.クラスを提供します。.ー:

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CustomControls">

<Style TargetType="{x:Type local:LineThicknessComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}">
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                ...
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

</ResourceDictionary>

こちらではの発想とcodebehind新CustomListBox:

namespace CustomControls
{
    public class CustomListBox : ListBox
    {
        public CustomListBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomListBox)
                        , new FrameworkPropertyMetadata(typeof(CustomListBox)));
        }
    }
}

やCustomListBox.クラスを提供します。.ー:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CustomControls">

<Style TargetType="{x:Type local:CustomListBox}" BasedOn="{StaticResource {x:Type ListBox}}">
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <Border>
                 ...
                     <local:LineThicknessComboBox />
                 ...  
                </Border>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

</ResourceDictionary>

こGenerix.ー:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="CustomControls;component/Themes/LineThicknessComboBox.Generic.xaml"/>
        <ResourceDictionary Source="CustomControls;component/Themes/CustomListBox.Generic.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

私の考え方をしているのか教えてください種類の参照の問題ることができていない何が間違っている。のプログラム統とな注意誤りがなかっCustomListBoxは私の主な用途とってエラー。などのLineThicknessComboBox、CustomListBoxに働きます。

誰でもできるので説明を取得しています。ることができる私のカスタム制御ものであっても同じカスタム制御ライブラリですよね?

よろしく!

役に立ちましたか?

解決

//私は、依存関係プロパティのメタデータは、常に静的コンストラクタで行う必要がありますオーバーライドので、それは両方のケースで静的コンストラクタすべきだと思います。

// not public LineThicknessComboBox()
static LineThicknessComboBox()        
{
            DefaultStyleKeyProperty.OverrideMetadata(
               typeof(LineThicknessComboBox)
                        , new FrameworkPropertyMetadata(
                              typeof(LineThicknessComboBox)));
}
  

OverrideMetadataするへの通話のみ静的コンストラクタ内で実行する必要がありますこの方法のforTypeパラメータとしての地位を提供するタイプの、または類似のインスタンスを介し。所有者のタイプが存在するインスタンスの後に変更メタデータにしようとすると、例外を発生しませんが、プロパティシステムにおける一貫性のない行動になります。

MSDN FROM

他のヒント

あなたはあなたでのdesignModeとコードの問題だコンストラクタに実行している可能性があります。私はWPFユーザーコントロールとデザイン面での問題の私の公正なシェアを持っていたし、それらのすべてがこのような不可解なエラーを持っているように私は、確かに言うことはできません。

ソリューションを使用すると、デザインモードであるかどうかを確認するためにSystem.ComponentModel.DesignerPropertiesクラスを使用して、実行しているから、それを防ぐために、もしブロックでデザインモードで機能しない任意のコードをラップすることです

namespace CustomControls
{
    public class LineThicknessComboBox : ComboBox
    {
        public LineThicknessComboBox()
        {
            // Design-mode capable code...

            if (DesignerProperties.GetIsInDesignMode(this)) return;

            // Design mode incapable code...

            DefaultStyleKeyProperty.OverrideMetadata(typeof(LineThicknessComboBox)
                        , new FrameworkPropertyMetadata(typeof(LineThicknessComboBox)));

        }
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top