C# 像XAML中的基类(本例中为StackPanel)一样使用自定义WPF控件(不)是可能的吗?

C# 像XAML中的基类(本例中为StackPanel)一样使用自定义WPF控件(不)是可能的吗?,c#,wpf,xaml,C#,Wpf,Xaml,我想基于StackPanel创建一个自定义控件,因为我需要向派生类添加一些代码 我在VisualStudio中创建了自定义控件 当我想在XAML中使用自定义控件时,会出现各种错误 我是WPF的新手 是否可以(不)像XAML中的基类一样使用自定义WPF控件(本例中为StackPanel) c#代码为 Generic.xaml内容是(创建自定义控件时生成的大多数部分): 然后,我尝试像MainWindow.xaml中的StackPanel一样使用“AbstractForm”: <Windo

我想基于StackPanel创建一个自定义控件,因为我需要向派生类添加一些代码

我在VisualStudio中创建了自定义控件

当我想在XAML中使用自定义控件时,会出现各种错误

我是WPF的新手

是否可以(不)像XAML中的基类一样使用自定义WPF控件(本例中为StackPanel)

c#代码为

Generic.xaml内容是(创建自定义控件时生成的大多数部分):


然后,我尝试像MainWindow.xaml中的StackPanel一样使用“AbstractForm”:

<Window x:Name="MyApp" x:Class="MyNameSpace.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:control="clr-namespace:MyNameSpace"
        mc:Ignorable="d"
        Title="MyApp" BorderBrush="{DynamicResource {x:Static SystemColors.ActiveCaptionTextBrushKey}}">
    <StackPanel x:Name="MyAppUI" Orientation = "vertical" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top">
        <control:AbstractForm x:Name="HeaderArea" Orientation = "horizontal" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top">
            <Image x:Name="appImage" HorizontalAlignment="Left" VerticalAlignment="Top" Source = "AppImage.gif"/>
            <StackPanel Orientation = "vertical" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top">
                <!-- more content -->
            </StackPanel>
        </control:AbstractForm>
        <!-- more content -->
    </StackPanel>
</Window>

运行应用程序时,我看到以下错误 (试图从德语重新翻译):

  • 在“AbstractForm”中找不到“Orientation”属性
  • 元素“方向”不可识别或不可访问
  • 属性“方向”不包含在XML命名空间“clr命名空间:MyNameSpace”中。一行专栏
  • 不能将任何内容添加到“AbstractForm”类型的对象(即,
    堆栈面板不是从控件派生的,因此没有
    模板
    属性。因此,ResourceDictionary不会编译

    从默认样式中删除Setter,然后重新生成项目

    <ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MyNameSpace">
    
        <Style TargetType="{x:Type local:AbstractForm}"
               BasedOn="{StaticResource {x:Type StackPanel}}">
        </Style>
    </ResourceDictionary>
    
    
    

    如果您的AbstractForm类需要一个默认样式,这也是值得怀疑的


    如果没有,只需删除整个Generic.xaml文件和覆盖DefaultStyleKey属性默认值的静态构造函数。换句话说,只需创建一个从StackPanel派生的类。

    StackPanel不是从控件派生的,因此没有
    模板
    属性。因此ResourceDictionary不会堆

    从默认样式中删除Setter,然后重新生成项目

    <ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MyNameSpace">
    
        <Style TargetType="{x:Type local:AbstractForm}"
               BasedOn="{StaticResource {x:Type StackPanel}}">
        </Style>
    </ResourceDictionary>
    
    
    

    如果您的AbstractForm类需要一个默认样式,这也是值得怀疑的


    如果没有,只需删除整个Generic.xaml文件和覆盖DefaultStyleKey属性默认值的静态构造函数。换句话说,只需创建一个从StackPanel派生的类。

    请看:。您不能继承xaml部分,只有后面的代码。您可以创建一个自定义控件并将StackPanel添加到xaml??然后在c#代码中扩展StackPanel您不能为
    StackPanel
    定义控件模板(
    ControlTemplate
    ),因为它不是控件(不是从
    System.Window.Controls.control
    类派生的)。您可以创建将StackPanel作为子控件的自定义/用户控件。这不是初学者级别的任务。您可能会发现此页面及其链接很有趣。请查看:。您不能继承Xaml部分,只能继承后面的代码。您可以创建自定义控件并将StackPanel添加到Xaml??中,然后在c中扩展StackPanel#代码您不能为
    堆栈面板
    定义控件模板(
    ControlTemplate
    ),因为它不是控件(不是从
    System.Window.Controls.control
    类派生的)。您可以创建一个自定义/用户控件,将StackPanel作为子控件。这不是初学者级别的任务。您可能会发现此页面及其链接很有趣。我删除了我接受了答案,但显然我没有适当的投票特权对其进行投票。再次感谢。我删除了我接受了答案,但显然我没有有适当的投票权来投票。再次感谢。
    <ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MyNameSpace">
    
        <Style TargetType="{x:Type local:AbstractForm}"
               BasedOn="{StaticResource {x:Type StackPanel}}">
        </Style>
    </ResourceDictionary>