在Mainwindow XAML中使用基类控件

时间:2016-12-03 04:34:15

标签: wpf

我想创建一个基类,它包含User contorl和window的属性以及Mainwindow.xaml中使用的基类控件。 下面的代码我正在使用,但得到以下错误“'MainWindow'的部分声明不能指定不同的基类”

Usercontrol1.xaml

<UserControl x:Class="WpfApplication1.UserControl1"
             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:WpfApplication1"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="80,46,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
        <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="80,82,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>

    </Grid>
</UserControl>

UserControl1.xaml.cs

namespace WpfApplication1
{
    public class baseclass : UserControl
    {
        public Button textBox { get; set; }

        public baseclass()
        {
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            if (!string.IsNullOrEmpty(textBox.ToString()))
            {

            }
        }
    }

    public partial class UserControl1
    {
        public UserControl1()
        {
            InitializeComponent();
        }


    }
}

现在的问题是我如何在我的主窗口中使用usecontrol进行下面的主窗口 的 Mainwindow.xaml.cs

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

MainWindow.xaml

<Window x:Class="WpfApplication1.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:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>

    </Grid>
</Window>

2 个答案:

答案 0 :(得分:2)

我不确定我是否遗漏了一些显而易见的东西或者其他人错过了一些明显的东西!我可以将baseclass添加到MainWindow,只需:

<Window x:Class="WpfApp2.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:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <local:baseclass />
</Window>

关键是local: xmlns名称空间定义为xmlns:local="clr-namespace:WpfApp2"

如果您不仅仅是货物代码,您可以看到上述内容对您有用。

现在你问的问题的真正答案是:你这样做错了! baseclass中的文本框将永远不会起作用,因为您尚未将其初始化为UserControl(除了继承UserControl之外还有更多内容)了解MvvM并停止依赖代码。你的生活将变得更加轻松。

答案 1 :(得分:0)

  
    

我想在主窗口中使用基本用户控件这是我想要做的事情

  

你不能。顶级窗口类无法从System.Windows.Controls.UserControl继承。它必须从System.Windows.Window继承。因此,无法在WPF中为用户控件和窗口定义公共基类。

您可以更改UserControl1的基类,但必须在XAML标记和代码隐藏文件中指定相同的基类:

<强> UserControl1.xaml.cs:

public partial class UserControl1 : baseclass
{
    public UserControl1()
    {
        InitializeComponent();
    }
}

<强> UserControl1.xaml:

<local:baseclass x:Class="WpfApplication1.UserControl1"
         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:WpfApplication1"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="80,46,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
    <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="80,82,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>

</Grid>
</local:baseclass>