web-dev-qa-db-ja.com

WPF UserControlはどのようにWPF UserControlを継承できますか?

次の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());



    }
}
83
Edward Tanguay

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

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

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

1
knee-cola

私は同じ問題にぶつかりましたが、コントロールが抽象クラスから継承する必要がありましたが、これはデザイナーによってサポートされていません。私の問題を解決したのは、ユーザーコントロールを(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
Sam L.

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

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

したがって、UserControlの代わりにCustomControlをベースクラスとして作成して、ベースクラスでの部分的な定義を回避できます(1つのコメントで説明)。

0
Kakha Middle Or