2009-10-15 141 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”的控件,然后在你的每个控件中使用它,而不是复制这个块。没有更多的背景和细节,很难给出一个好的解决方案。