2009-10-14 3 views
3

У меня есть страничный менеджер, который хранит коллекцию страниц (usercontrols), отправляет себя на каждую страницу, что может вызвать его метод SwitchPage в любое время, позволяя мне вставлять ссылки с одной страницы на другую. Это работает хорошо и позволяет мне иметь быстрое меню и т.д.Как заставить код UserControls наследовать базовый класс?

public partial class PageManager : UserControl 
{ 
    private Dictionary<string, UserControl> Pages = new Dictionary<string, UserControl>(); 

    private string defaultPageIdCode = "page1"; 
    private UserControl currentPage; 
    private string currentPageIdCode; 

    public PageManager() 
    { 
     InitializeComponent(); 

     LoadPages(); 
     SwitchPage(defaultPageIdCode); 
    } 

    private void LoadPages() 
    { 
     Pages.Add("page1", new Page1(this)); 
     Pages.Add("page2", new Page2(this)); 
    } 

    public void SwitchPage(string pageIdCode) 
    { 
     currentPageIdCode = pageIdCode; 
     currentPage = Pages[pageIdCode]; 
     PageArea.Content = currentPage; 
    } 
} 

Однако каждая страница (UserControl) повторил функциональность в нем, например, сохранение объекта PageManager внутри, который я хотел бы поставить в базовом классе:

Page1.xaml:

<UserControl x:Class="TestPageManager23434.Page1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel Background="White" 
      Width="400" 
      Height="400"     
       > 
     <TextBlock Text="this is page1"/> 
     <Button Content="go to page 2" Click="Button_Click" 
       HorizontalAlignment="Left" 
       Width="200" 
       Height="30" 
       /> 
    </StackPanel> 
</UserControl> 

Page1.xaml.cs:

public partial class Page1 : UserControl 
{ 
    private PageManager pageManager; 

    public Page1(PageManager pageManager) 
    { 
     this.pageManager = pageManager; 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, System.Windows.RoutedEventArgs e) 
    { 
     pageManager.SwitchPage("page2"); 
    } 
} 

Page2.xaml:

<UserControl x:Class="TestPageManager23434.Page2" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel Background="White" 
       Width="400" 
       Height="400" 
       > 
     <TextBlock Text="this is page2"/> 
     <Button Content="go back to page 1" Click="Button_Click" 
       HorizontalAlignment="Left" 
       Width="250" 
       Height="30" 
       /> 
    </StackPanel> 
</UserControl> 

Page2.xaml.cs:

public partial class Page2 : UserControl 
{ 
    private PageManager pageManager; 

    public Page1(PageManager pageManager) 
    { 
     this.pageManager = pageManager; 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, System.Windows.RoutedEventArgs e) 
    { 
     pageManager.SwitchPage("page1"); 
    } 
} 

Как сделать каждый UserControl наследовать базовый класс? Он не работает, поскольку каждый UserControl имеет XAML, который не может быть унаследован. И если я пытаюсь наследовать от обычного класса, который наследует UserControl, то он говорит мне:

Частичные декларации «TestPageManager23434.Page2» не должны указывать различные базовые классы

ответ

7

Вместо того, объявляя root как UserControl, объявите его как ваш производный класс. Вам также необходимо указать пространство имен, например.

<local:PageBase x:Class="TestPageManager23434.Page2" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:TestPageManager23434"> 
</local:PageBase> 
+0

Очевидно, класс в коде должен затем также наследовать от базового класса ... –

+0

На самом деле, я обнаружил на другой день, что вам не нужно указать базовый класс в коде позади, и Resharper будет фактически отмечать это как избыточность. Только одна часть определения частичного класса должна указывать базовый класс, считая, что он должен указать его на несколько частей, если они совпадают. –

Смежные вопросы