我有usercontrols,它继承了一个基类,如下所示:
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");
}
}
}
但是现在在我的各种UserControls的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吗?
答案 0 :(得分:4)
我建议在MSDN上阅读WPF Control Authoring Overview。我不认为你能够实现你正在尝试用UserControls做什么。 UserControls几乎意味着将一组控件粘合在一起,以便在单个应用程序的范围内一致地重用它们。他们真的不是为了继承。
您可以做的一件事是以某种“MasterPage”方式使用它们(如果您熟悉ASP.NET)。您可以将ContentControls放在“基础”UserControl中,并公开不同的属性,允许其他人将内容注入基本控件的标准布局。通过这种方式,您的其他UserControl将“基础”UserControl作为其自身内部的根元素,并将各种内容属性设置为他们想要的任何元素。
答案 1 :(得分:1)
在你的例子中,通过创建一个名为“NavigationControl”的控件,然后在每个控件中使用它而不是复制同一个块,听起来最好。如果没有更多的背景和细节,很难给出一个好的解决方案。
答案 2 :(得分:0)
您可以编写xaml然后使用XamlReader将xaml解析为对象,它为您提供了编写xml而不是代码的优势。
答案 3 :(得分:0)
如果您的每个控件都有这样的常用项,那么您可以让用户控制常用项并在每个其他用户控件中使用它。
其次,我可以看到你在公共项目中有一些业务逻辑,但是编写业务逻辑的事件方式稍微差一点,你应该考虑创建命令和实现命令。这将需要更多的研究,但它可以让你轻松设计更大的项目。