WPFユーザーコントロールはどのようにしてWPFユーザーコントロールを継承できますか?


92

次のWPF UserControlは、機能するDataTypeWholeNumberを呼び出しました。

次に、DataTypeDateTimeDataTypeEmailなどのUserControlを作成します

依存関係プロパティの多くはこれらすべてのコントロールで共有されるため、共通のメソッドをBaseDataTypeに入れこれらの各UserControlがこの基本タイプから継承されるようにします。

しかし、それを行うと、エラーが発生します:部分宣言に異なる基本クラスがない可能性があります

では、共有機能がすべて基本クラスにあるように、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());



    }
}

:WPF用のVisual継承を参照して回避svetoslavsavov.blogspot.gr/2009/09/...または明示的祖先を参照の中でGUIを定義するためのsupport.microsoft.com/kb/957231
ジョージBirbilis

回答:


130

新しいベースタイプからも継承するように、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の最初のタグの両方で(上記のように)基本クラスから継承されていることを確認します。

4
「... DataTypes.BaseDataTypeはXAMLを使用して定義されているため、XAMLファイルのルートにすることはできません」というエラーが発生すると、この循環参照からどのように抜け出しますか?
Edward Tanguay

9
基本クラスを、xmalを定義せずにUserControlから継承する通常のタイプにすることができる場合(2つのファイルに分割された部分クラスではない)。問題は、xmalを継承できないことです。そのため、基本クラスまたは子クラスのいずれかがxmalファイルを持つ必要はありません。それか、クラスをユーザーコントロールではなくカスタムコントロールにします。この方法では、部分クラスの外で外観が定義されますが、ユーザーコントロールの使いやすさが失われます。
マーティンハリス

1
それだけです。BaseDataTypeをUserControlを継承する通常のクラスにすると、機能します。ありがとう、ありがとう。
Edward Tanguay

@Martinあなたのコメントを反映するためにあなたの答えを更新したいと思うかもしれません、そしてそれは本当の答えです。
ブライアンアンダーソン、

「コントロールベース」の要素を、継承するクラスの要素の上に作成する方法はありますか?
Juan M. Elosegui

2
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>    

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

デザイナーによって作成された部分的なクラス定義があり、InitializeComponent()メソッド定義を介して簡単に開くことができます。次に、部分クラスの継承をUserControlからBaseDataType(またはクラス定義で指定したもの)に変更します。

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

したがって、(1つのコメントで説明されているように)UserControlではなくCustomControlを基本クラスとして作成して、基本クラスでの部分的な定義を回避できます。


Controls.LoginからControls.BaseControlに変換できません。
Himilou 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.