WPF UserControl berikut disebut DataTypeWholeNumber yang berfungsi.
Sekarang saya ingin membuat UserControl yang disebut DataTypeDateTime dan DataTypeEmail , dll.
Banyak Properti Ketergantungan akan dibagi oleh semua kontrol ini dan oleh karena itu saya ingin meletakkan metode umum mereka ke dalam TipeData dan masing-masing KontrolPengguna ini diwarisi dari tipe dasar ini.
Namun, ketika saya melakukan itu, saya mendapatkan kesalahan: Deklarasi Parsial mungkin tidak memiliki kelas dasar yang berbeda .
Jadi bagaimana saya dapat mengimplementasikan warisan dengan UserControls sehingga fungsionalitas bersama semuanya ada di kelas dasar?
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());
}
}
c#
wpf
xaml
user-controls
Edward Tanguay
sumber
sumber
Jawaban:
Pastikan Anda telah mengubah tag pertama di xaml untuk juga mewarisi dari jenis dasar baru Anda
Begitu
<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" >
menjadi
<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" >
Jadi, untuk meringkas jawaban lengkap termasuk detail tambahan dari komentar di bawah ini:
sumber
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>
sumber
Saya menemukan jawabannya di artikel ini: http://www.paulstovell.com/xmlnsdefinition
Pada dasarnya apa yang dikatakan adalah bahwa Anda harus mendefinisikan namespace XML di file AssemlyInfo.cs, yang dapat digunakan di XAML. Ini berhasil untuk saya, namun saya menempatkan kelas kontrol pengguna dasar di DLL terpisah ...
sumber
Saya mengalami masalah yang sama tetapi perlu memiliki kontrol yang diwarisi dari kelas abstrak, yang tidak didukung oleh desainer. Apa yang memecahkan masalah saya adalah membuat usercontrol mewarisi dari kelas standar (yang mewarisi UserControl) dan antarmuka. Dengan cara ini desainer bekerja.
//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) }
sumber
Ada sebagian definisi kelas yang dibuat oleh desainer, Anda dapat membukanya dengan cara mudah melalui definisi metode InitializeComponent (). Kemudian ubah saja sebagian kelas hak milik dari UserControl ke BaseDataType (atau yang Anda tentukan dalam definisi kelas).
Setelah itu Anda akan mendapat peringatan bahwa metode InitializeComponent () disembunyikan di kelas anak.
Oleh karena itu, Anda dapat menjadikan CustomControl sebagai klas dasar daripada UserControl untuk menghindari definisi parsial dalam kelas dasar (seperti yang dijelaskan dalam satu komentar).
sumber