2009-05-20 32 views
80

WPF UserControl sau đây được gọi là DataTypeWholeNumber hoạt động.Làm thế nào để một UserFrol WPF kế thừa một UserFrol WPF?

Bây giờ tôi muốn thực hiện một UserControl gọi DataTypeDateTimeDataTypeEmail vv

Nhiều người trong số Properties phụ thuộc sẽ được chia sẻ bởi tất cả các điều khiển và do đó tôi muốn đặt phương pháp phổ biến của họ vào một BaseDataType và có mỗi UserControl này kế thừa từ loại cơ sở này.

Tuy nhiên, khi tôi làm điều đó, tôi nhận được lỗi : Tuyên bố một phần có thể không có các lớp cơ sở khác nhau.

Vậy làm thế nào tôi có thể thực hiện kế thừa với UserControls để chức năng chia sẻ là tất cả trong lớp cơ sở?

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



    } 
} 
+0

cho cách giải quyết WPF với kế thừa Visual xem: http://svetoslavsavov.blogspot.gr/2009/09/user-control-inheritance-in-wpf.html hoặc để xác định rõ ràng GUI trong tổ tiên xem http: // support.microsoft.com/kb/957231 –

Trả lời

114

Đảm bảo rằng bạn đã thay đổi thẻ đầu tiên trong XAML cũng kế thừa từ basetype mới của bạn

Vì vậy

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

trở thành

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

Vì vậy, tóm tắt câu trả lời hoàn chỉnh bao gồm các chi tiết bổ sung từ các nhận xét bên dưới:

  • Lớp cơ sở không được bao gồm tệp xaml. Xác định nó trong một tệp cs (không phải một phần) duy nhất và xác định nó để kế thừa trực tiếp từ Usercontrol.
  • Đảm bảo rằng lớp con kế thừa từ lớp cơ sở cả trong tệp cs-behind-code và trong thẻ đầu tiên của xaml (như được hiển thị ở trên).
+3

khi tôi thực hiện thay đổi đó, tôi nhận được lỗi: "... DataTypes.BaseDataType không thể là thư mục gốc của tệp XAML vì nó được định nghĩa bằng XAML", làm thế nào để bạn thoát khỏi điều này tham chiếu vòng tròn? –

+9

Nếu bạn chỉ có thể làm cho lớp cơ sở là một kiểu bình thường kế thừa từ UserControl mà không định nghĩa bất kỳ xmal nào (do đó không phải là một lớp chia thành hai tệp). Vấn đề là bạn không thể kế thừa xmal, do đó, hoặc là lớp cơ sở hoặc lớp con không cần phải có tệp xmal. Hoặc là điều đó hoặc làm cho các lớp học của bạn tùy chỉnh điều khiển thay vì một điều khiển người dùng. Bằng cách đó, sự xuất hiện được định nghĩa bên ngoài lớp học một phần nhưng bạn sẽ mất sự dễ dàng sử dụng của một điều khiển người dùng. –

+1

Đó là nó: nếu bạn tạo BaseDataType là một lớp bình thường kế thừa UserControl, thì nó hoạt động. Cảm ơn vô cùng. –

1

Tôi tìm thấy câu trả lời trong bài viết này: http://www.paulstovell.com/xmlnsdefinition

Về cơ bản những gì là nói là bạn nên xác định một không gian tên XML trong file AssemlyInfo.cs, mà có thể được sử dụng trong XAML. Nó làm việc cho tôi, tuy nhiên tôi đã đặt lớp điều khiển người dùng cơ sở trong một DLL riêng biệt ...

0

Tôi gặp vấn đề tương tự nhưng cần có quyền kiểm soát kế thừa từ lớp trừu tượng, không được nhà thiết kế hỗ trợ. Điều gì giải quyết vấn đề của tôi là làm cho usercontrol kế thừa từ cả một lớp tiêu chuẩn (kế thừa UserControl) và một giao diện. Bằng cách này, nhà thiết kế đang làm việc.

//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
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>  
0

Có một phần định nghĩa lớp được tạo ra bởi nhà thiết kế, bạn có thể mở nó dễ dàng cách qua InitializeComponent() phương pháp định nghĩa. Sau đó, chỉ cần thay đổi một phần lớp iheritence từ UserControl thành BaseDataType (hoặc bất kỳ bạn đã xác định trong định nghĩa lớp).

Sau đó bạn sẽ có cảnh báo rằng phương thức InitializeComponent() được ẩn trong lớp con.

Vì vậy, bạn có thể đặt CustomControl làm cơ sở thay vì UserControl để tránh định nghĩa một phần trong lớp cơ sở (như được mô tả trong một nhận xét).

+0

Không thể chuyển đổi từ Controls.Login sang Controls.BaseControl. – Himilou

Các vấn đề liên quan