簡體   English   中英

WPF UserControl如何繼承WPF UserControl?

[英]How can a WPF UserControl inherit a WPF UserControl?

以下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());



    }
}

確保您已更改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的第一個標記中繼承基類(如上所示)。
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繼承標准類(繼承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()方法定義輕松打開它。 然后只需將部分類iheritence從UserControl更改為BaseDataType(或您在類定義中指定的任何內容)。

之后,您將發出警告,在子類中隱藏了InitializeComponent()方法。

因此,您可以將CustomControl設置為基本clas而不是UserControl,以避免在基類中進行部分定義(如一條注釋中所述)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM