1

我需要创建一个 BaseUserControl,它背后有一些自定义代码并继承自 UserControl,因此它可以用作实际使用 UserControls 的 ParrentClass。我读过很多文章,但我根本无法让它工作。BaseUserControl 不应该有任何设计元素,而是纯自定义的东西,例如要在将从它继承的其他 UserControls 中使用的引用,但设计元素会被引用。我将需要更多这样的 baseUseControls,所以扩展是不可能的。BaseUser 控件在一个项目中,而继承它的其余部分在另一个项目中。

1)我试图只创建一个继承的类。

public class EntryUserControlBase:UserControl
{
    public EntryUserControlBase()
    {

    }
}

2) 也是继承自 UserControl

<UserControl x:Class="SPIS_Base.EntryUserControlBase"
         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>
</UserControl>

我试图像这样继承它

<local:EntryUserControlBase x:Class="SPIS.AppControls.uclLogin"
         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"
         xmlns:local="clr-namespace:SPIS_Base;assembly=SPIS_Base"
         mc:Ignorable="d" 
         d:DesignHeight="200" d:DesignWidth="300">
    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ShowGridLines="False">

    </Grid>
</local:EntryUserControlBase>  

我发现很多文章解释了如何做到这一点,但我无法让它运行。

有小费吗?

4

2 回答 2

0

WPF 不允许像您在 WinForms 中实现的这种“视觉继承”,其中基类具有设计的 UI(在本例中为 XAML 定义)。这仅在 WinForms 中有效,因为它生成设计器的方式用于构建 UserControl 或 Form 内容的代码。XAML 解析是一种完全不同的方法,“合并”两个 XAML 文件的内容并不是一个定义明确的操作。

在 WPF 中有多种组合方式可以实现相同的目标。一些例子:

  1. 创建一个正确支持Control Template的自定义控件(不是 UserControl)。这允许您定义可扩展点,例如将嵌入的“内容”放置在控件中的位置。

  2. 定义允许将“基本”属性应用到用户控件的样式。这不如完全控制模板设计灵活,但更容易实现。

于 2013-05-09T17:43:23.703 回答
0

我正在使用以下内容来继承用户控件中的基本属性和函数。

//Base class
using System.Windows.Controls;
namespace Controls
{
    public class BaseUserControl: UserControl
    {
        protected string getText()
        {
            return "Hello World";
        }
    }
} 

//Sub class
<Controls:BaseUserControl x:Class="MyNameSpace.MyUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:Controls="clr-namespace:Controls;assembly=MyAssembly">
</Controls:BaseUserControl>

using Controls;
public partial class MyUserControl : BaseUserControl
{
    public MyUserControl ()
    {
        var baseText = getText();
    }
}
于 2013-05-10T11:43:23.537 回答