2009-05-20 30 views
80

次のWPF UserControlはDataTypeWholeNumberという名前で動作します。WPF UserControlはどのようにしてWPF UserControlを継承できますか?

今私はなど、ユーザーコントロールは、DataTypeDateTimeDataTypeEmailと呼ばれるようにしたい

依存関係プロパティの多くは、これらすべてのコントロールによって共有されるので、私はに彼らの共通のメソッドを入れたいですBaseDataTypeこれらの各UserControlsにこの基本型を継承させます。私はそれを行うとき

はしかし、私はエラーが表示されます。部分的な宣言は異なる基底クラスを持っていないかもしれません。

UserControlsで継承を実装すると、どのように共有機能がすべて基本クラスに含まれますか?

using System.Windows; 
using System.Windows.Controls; 

namespace TestDependencyProperty827.DataTypes 
{ 
    public partial class DataTypeWholeNumber : BaseDataType 
    { 
     public DataTypeWholeNumber() 
     { 
      InitializeComponent(); 
      DataContext = this; 

      //defaults 
      TheWidth = 200; 
     } 

     public string TheLabel 
     { 
      get 
      { 
       return (string)GetValue(TheLabelProperty); 
      } 
      set 
      { 
       SetValue(TheLabelProperty, value); 
      } 
     } 

     public static readonly DependencyProperty TheLabelProperty = 
      DependencyProperty.Register("TheLabel", typeof(string), typeof(BaseDataType), 
      new FrameworkPropertyMetadata()); 


     public string TheContent 
     { 
      get 
      { 
       return (string)GetValue(TheContentProperty); 
      } 
      set 
      { 
       SetValue(TheContentProperty, value); 
      } 
     } 

     public static readonly DependencyProperty TheContentProperty = 
      DependencyProperty.Register("TheContent", typeof(string), typeof(BaseDataType), 
      new FrameworkPropertyMetadata()); 


     public int TheWidth 
     { 
      get 
      { 
       return (int)GetValue(TheWidthProperty); 
      } 
      set 
      { 
       SetValue(TheWidthProperty, value); 
      } 
     } 

     public static readonly DependencyProperty TheWidthProperty = 
      DependencyProperty.Register("TheWidth", typeof(int), typeof(DataTypeWholeNumber), 
      new FrameworkPropertyMetadata()); 



    } 
} 
+0

Visual継承を使用したWPF回避策:http://svetoslavsavov.blogspot.gr/2009/09/user-control-inheritance-in-wpf.htmlまたは祖先でGUIを明示的に定義する場合はhttp://を参照してください。 support.microsoft.com/kb/957231 –

答えて

114

はまたあなたの新しいbasetypeから継承するXAMLで、あなたが最初のタグを変更したことを確認してください

ので

<UserControl x:Class="TestDependencyProperty827.DataTypes.DataTypeWholeNumber" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
    xmlns:s="clr-namespace:System;assembly=mscorlib" 
    > 

だから

<myTypes:BaseDataType x:Class="TestDependencyProperty827.DataTypes.DataTypeWholeNumber" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
    xmlns:s="clr-namespace:System;assembly=mscorlib" 
    xmlns:myTypes="clr-namespace:TestDependencyProperty827.DataTypes" 
    > 

となり、を含む完全な答えを要約する以下のコメントから追加の詳細:

  • 基本クラスにはxamlファイルを含めないでください。それを単一の(部分的でない)csファイルで定義し、Usercontrolから直接継承するように定義します。
  • サブクラスがcsコードビハインドファイルとxamlの最初のタグの両方で(上記のように)ベースクラスを継承していることを確認します。
+3

私はその変更を行うとエラーが表示されます。 "DataTypes.BaseDataTypeはXAMLを使用して定義されているため、XAMLファイルのルートにすることはできません"循環参照? –

+9

基本クラスを任意のxmalを定義せずにUserControlから継承する通常の型にすることができます(2つのファイルに分割された部分クラスではありません)。問題はあなたがxmalを継承することができないということです。そのため、ベースクラスまたは子クラスのいずれかがxmalファイルを持たないようにする必要があります。いずれか、またはクラスのカスタムコントロールではなく、ユーザーのコントロールを作成します。そうすれば外観は部分クラス外で定義されますが、ユーザコントロールの使いやすさは失われます。 –

+1

それです:BaseDataTypeをUserControlを継承する通常のクラスにすると、正常に動作します。素晴らしい、ありがとう。 –

1

私はこの記事で答えを見つけました:http://www.paulstovell.com/xmlnsdefinition

基本的にはどのようなのは、XAMLで使用することができAssemlyInfo.csファイル内のXML名前空間を定義する必要があることであると言います。それは私のために働いたが、私は基本的なユーザーコントロールクラスを別のDLLに配置しました...

0

私は同じ問題が発生しましたが、コントロールがデザイナーによってサポートされていない抽象クラスから継承する必要がありました。私の問題を解決したのは、UserControlを継承する標準クラス(UserControlを継承する)とインターフェイスの両方から継承することです。デザイナーがこの方法で作業しています。

//the xaml 
<local:EcranFiche x:Class="VLEva.SIFEval.Ecrans.UC_BatimentAgricole" 
        xmlns:local="clr-namespace:VLEva.SIFEval.Ecrans" 
        ...> 
    ... 
</local:EcranFiche> 

// the usercontrol code behind 
public partial class UC_BatimentAgricole : EcranFiche, IEcranFiche 
{ 
    ... 
} 

// the interface 
public interface IEcranFiche 
{ 
    ... 
} 

// base class containing common implemented methods 
public class EcranFiche : UserControl 
{ 
    ... (ex: common interface implementation) 
} 
0
public partial class MooringConfigurator : MooringLineConfigurator 
    { 
     public MooringConfigurator() 
     { 
      InitializeComponent(); 
     } 
    } 



<dst:MooringLineConfigurator x:Class="Wave.Dashboards.Instruments.ConfiguratorViews.DST.MooringConfigurator" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:dst="clr-namespace:Wave.Dashboards.Instruments.ConfiguratorViews.DST" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="400"> 

    <Grid x:Name="LayoutRoot" Background="White"> 

    </Grid> 
</dst:MooringLineConfigurator>  
0

設計者が作成した部分クラス定義がありますが、あなたは簡単な方法のInitializeComponent()メソッドの定義を経由して、それを開くことができます。 次に、部分的なクラスの継承をUserControlからBaseDataType(またはクラス定義で指定したもの)に変更します。

その後、InitializeComponent()メソッドが子クラスに隠されているという警告が表示されます。

したがって、(1つのコメントに記載されているように)基本クラスの部分的な定義を避けるために、CustomControlをUserControlの代わりに基本クラスとして作成することができます。

+0

Controls.LoginからControls.BaseControlに変換できません。 – Himilou

関連する問題