2009-10-15 184 views
2

我有繼承基類,它看起來是這樣的用戶控件:是否可以繼承XAML?

BasePage.cs:

using System.Windows.Controls; 

namespace TestPageManager23434 
{ 
    public class BasePage : UserControl 
    { 
     public string ButtonPreviousText { get; set; } 
     public string ButtonNextText { get; set; } 

     protected PageManager pageManager; 

     public BasePage(PageManager pageManager) 
     { 
      this.pageManager = pageManager; 
     } 
    } 
} 

和看起來像這樣的用戶控件:

XAML:

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

代碼背後:

using System.Windows.Controls; 

namespace TestPageManager23434 
{ 
    public partial class Page1 : BasePage 
    { 
     public string Message { get; set; } 

     public Page1(PageManager pageManager) : base(pageManager) 
     { 
      InitializeComponent(); 
      DataContext = this; 
     } 

     private void Button_Click(object sender, System.Windows.RoutedEventArgs e) 
     { 
      pageManager.SwitchPage("page2"); 
     } 
    } 
} 
在我的各種用戶控件的XAML我部分

但現在我也有XAML塊我也想從基類繼承,這樣我就沒有這個塊中的每個XAML文件複製:

<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Left"> 
    <Button 
     Content="{Binding ButtonPreviousText}" 
     Width="150" 
     Margin="5" 
     Click="ButtonPrevious_Click"/> 
    <Button 
     Content="{Binding ButtonNextText}" 
     Width="150" 
     Click="ButtonNext_Click" Margin="5"/> 
</StackPanel> 

但自從我的基類沒有XAML中,我看到了兩個辦法:

  • 在代碼中創建它們在我的基類
  • 爲他們創造

用戶控件或者是有另一種方式擁有此XAML在一個位置或某種方式來繼承XAML?

回答

4

我建議閱讀MSDN上的WPF Control Authoring Overview。我認爲你無法實現你想用UserControls做的事情。用戶控件幾乎意味着將一組控件粘合在一起,以便在單個應用程序的範圍內一致地重用它們。它們實際上並不意味着被遺傳。

你可以做的一件事就是以一種「母版頁」的方式使用它們(如果你熟悉ASP.NET的話)。您可以將ContentControls放入「基本」UserControl中,並公開不同的屬性,這些屬性允許其他屬性將內容注入到基本控件的標準佈局中。通過這種方式,您的其他用戶控件將「基本」UserControl作爲根元素放入其中,並將各種內容屬性設置爲所需的任何元素。

+0

試圖編輯錯字:授權 - >創作,但是將短的編輯由我承擔。這是一個有點混亂的錯字... – 2012-01-07 19:01:00

+0

@David Perlman,謝謝,修正它! – 2012-01-07 22:01:49

0

那麼你可以編寫xaml,然後使用XamlReader解析xaml到對象,它給你寫xml代替代碼的好處。

0

如果您的每個控件都有這樣的常用項目,那麼您可以對常用項目進行用戶控制,並在每個其他用戶控件中使用它。第二,我可以看到你在普通項目中有一些業務邏輯,但事務編寫業務邏輯的方式稍微老一點,你應該考慮創建命令並執行命令。這將需要更多的研究,但它會讓你輕鬆設計更大的項目。

1

在你的例子中,聽起來你最好通過創建一個名爲「NavigationControl」的控件,然後在你的每個控件中使用它,而不是複製這個塊。沒有更多的背景和細節,很難給出一個好的解決方案。