2010-10-20 34 views
5

Tôi gặp sự cố với quyền thừa kế điều khiển trong WPF. Tôi tạo ra một UserControl tên BaseUserControl. Tôi muốn kiểm soát này là một điều khiển cơ sở cho các userControl khác của WPF. Vì vậy, tôi đã viết một UserControl khác gọi là FirstComponent. Trong bước tiếp theo tôi đã thay đổi mã nàywpf - thừa kế UserControl

FirstComponent : UserControl 

này

FirstComponent : BaseControl 

Tuy nhiên trong quá trình biên soạn tôi nhận được lỗi này

Partial declarations of 'controlinheritance.componenets.FirstComponent' must not specify different base classes 

Tôi nên làm gì để cho phép FirstComponent để lấy được từ BaseControl?

EDIT Nhờ có câu trả lời tuyệt vời, tôi quản lý để kế thừa các điều khiển. Howerver Tôi có một câu hỏi khác. Trong lớp cơ sở, tôi đã chỉ định một thuộc tính public Grid _MainGrid {get; bộ; }. Bây giờ tôi muốn trong lớp dẫn xuất của tôi tạo ra một thể hiện của lưới này. Vì vậy, tôi đã sử dụng mã này Howerver Tôi gặp lỗi Thuộc tính '_MainGrid' không có giá trị. Vị trí Dòng 8 36.

Trả lời

5

Bạn có thấy bài viết đầy đủ của tôi về nó không?

http://www.dotnetfunda.com/articles/article832-define-base-class-for-window--usercontrol-.aspx

Tôi hy vọng rằng sẽ giúp bạn trong việc này.

Nếu bạn cố thực hiện dự án, chắc chắn nó sẽ gửi lỗi tới bạn. Điều này là bởi vì, mỗi cửa sổ WPF được tạo ra từ bố cục baseWindow thay vì bố cục cửa sổ hiện tại. Nói cách khác, nếu bạn xem XAML, bạn sẽ thấy thẻ gốc là Cửa sổ, là một lớp chỉ là cha mẹ của cửa sổ hiện tại.

Vì vậy, để đảm bảo mọi thứ hoạt động hoàn hảo, chúng tôi cần thay đổi Phần tử gốc .

Vì vậy, nó sẽ trông như thế:

<local:BaseWindow Class="BaseWindowSample.Window1" 
        Name="winImp" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:BaseWindowSample" 
        Title="Window1"> 
... 
</local:BaseWindow> 

Nếu bạn thấy điều này tỉ mỉ, bạn có thể thấy tôi đã thêm một không gian tên cho dự án của tôi và đặt tên nó như địa phương. Vì vậy, BaseWindow phải xuất phát từ BaseWindow và do đó nó đi như thế địa phương: BaseWindow

+0

cám ơn nó đã giúp tôi rất nhiều . Bạn có thể nhìn vào thông điệp sắc sảo của tôi không – Berial

0

Vâng lý do cho các lỗi ban đầu là do lớp thực sự là một lớp học phần đã được niêm yết một thừa kế cơ sở đặc biệt ở một nơi khác ngoài các vị trí nơi bạn đã thay đổi lớp cơ sở của mình.

Đối với tài sản của bạn 'thừa kế', tôi khuyên bạn nên cố gắng

public Grid MainGrid 
{ 
    get 
    { 
     return base.MainGrid; 
    } 

    set 
    { 
     base.MainGrid = value; 
    } 
} 

Tuy nhiên tôi nên lưu ý rằng điều này sẽ không cung cấp cho bạn một liên kết đến bất kỳ trường hợp hiện có (s) của lớp cơ sở của bạn. Nếu bạn muốn có một liên kết được bảo đảm trong lớp dẫn xuất của bạn với cá thể đơn lẻ của lưới đó, thì bạn sẽ phải làm cho thuộc tính lớp cơ sở là tĩnh. Trong trường hợp này, mã của bạn sẽ trông như thế này ...

public Grid MainGrid 
{ 
    get 
    { 
     return BaseControl.MainGrid; 
    } 

    set 
    { 
     BaseControl.MainGrid = value; 
    } 
} 
0

Khi bạn chỉ định một lớp cơ sở khác nhau cho một usercontrol trong XAML.cs nộp

FirstComponent : BaseControl 

Bạn cũng nên thay đổi điều này trong XAML

<Base:BaseControl x:Class="FirstComponent" 
      xmlns:Base="clr-namespace:MyApplication.Base" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 


    </Grid> 
</Base:BaseControl> 
Các vấn đề liên quan