次のWPF UserControlはDataTypeWholeNumberと呼ばれ、動作します。
ここで、DataTypeDateTimeおよびDataTypeEmailなどと呼ばれるUserControlを作成します。
依存関係プロパティの多くはこれらすべてのコントロールで共有されるため、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());
}
}
新しいベースタイプからも継承するように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"
>
したがって、以下のコメントからの追加の詳細を含む完全な回答を要約するには:
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>
この記事で答えを見つけました: http://www.paulstovell.com/xmlnsdefinition
基本的に、AssemlyInfo.csファイルでXML名前空間を定義する必要があります。これはXAMLで使用できます。私にとってはうまくいきましたが、ベースユーザーコントロールクラスを別のDLLに配置しました...
私は同じ問題にぶつかりましたが、コントロールが抽象クラスから継承する必要がありましたが、これはデザイナーによってサポートされていません。私の問題を解決したのは、ユーザーコントロールを(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)
}
デザイナによって作成された部分的なクラス定義があり、InitializeComponent()メソッド定義を介して簡単に開くことができます。次に、部分クラスの継承をUserControlからBaseDataType(またはクラス定義で指定した任意のもの)に変更します。
その後、InitializeComponent()メソッドが子クラスで非表示になるという警告が表示されます。
したがって、UserControlの代わりにCustomControlをベースクラスとして作成して、ベースクラスでの部分的な定義を回避できます(1つのコメントで説明)。