WPF 控件【U】UserControl(一) UserControl、ContentControl、Page的区别,及它们的使用方法

本文介绍了UserControl、ContentControl和Page的性质与用法。三者需放在Window下显示,Prism架构中要放在shell。UserControl用于满足特殊需求,ContentControl可切换动态内容,Page封装了对Frame的导航。还给出了它们各自的使用方法及参考链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介

        本文将介绍用户控件UserControl与Page的区别,及两者的使用方法。

部分参考:

https://www.cnblogs.com/lelehellow/p/6026766.html(重点)

https://www.cnblogs.com/ZXdeveloper/p/4479721.html

https://www.cnblogs.com/denghejun/p/3671061.html

还有其他参考,见下文。

二、UserControl、ContentControl、Page性质、用法

1、三者,一定要放在Window下才能显示。若是在Prism架构中,一定要放在shell才能显示。

2、常情况下,一个window加载多个page,而运行的solution大都是一个window。

3、当微软自带的控件(比如button,canvas等)不足以满足开发者的需求,这是可以用到usercontrol啦。

4、ContentControl用来切换动态内容。

5、其他(若有其他区别,请大家告知我一下,我学习学习。非常感谢)

1、UserControl

1.1、性质

     省略。UserControl是一定要放在Window中才能显示的。

1.2、用法

1.2.1、Window的Xaml直接添加

<Window x:Class="WpfApplicationDemo.UserControlDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfApplicationDemo.Control"
    Title="UserControlDemo" Height="300" Width="300" Loaded="Window_Loaded">
    <Grid>
        <TextBlock Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="textBlock1" Text="下面是用户控件" VerticalAlignment="Top" />
        <StackPanel Height="175" HorizontalAlignment="Left" Margin="20,57,0,0" Name="stackPanel1" VerticalAlignment="Top" Width="246" />
        <my:UserControl1 HorizontalAlignment="Left" Margin="38,46,0,0" x:Name="userControl11" VerticalAlignment="Top" Height="183" Width="406" />
    </Grid>
</Window>

1.2.2、Window的C#代码中直接添加

public partial class UserControlDemo : Window
    {
        public UserControlDemo()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            UserControl1 demo = new UserControl1();
            this.stackPanel1.Children.Add(demo);
        }
    }

或者

1.2.3、Window下Frame.Content加载

https://blog.youkuaiyun.com/lordwish/article/details/52667150

UserControl control = obj as UserControl;
this.frame1.Content = control;

2、ContentControl

2.1、性质

内容控件ContentControl,往往用来加载动态内容,比如动态加载UserControl.xaml。

2.2、用法

2.2.1、contentControl.Content直接加载UserControl.xaml

contentControl.Content = userControl1

参考:https://blog.youkuaiyun.com/xm9304/article/details/46412349

2.2.2、Prism.MVVM架构中ContentControl区域可以动态切换用户控件UserControl

 

2.2.1、Prism.MVVM架构中ContentControl区域 

3、Page

3.1、性质

参考1:https://blog.youkuaiyun.com/software_kid/article/details/9339847

Page 是从 UserControl 继承的,Page 封装了对 Frame 的导航,这也是 Page 的最大特点和职责,而 UserControl 没有这个职责。

参考2:https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.controls.page?redirectedfrom=MSDN&view=netframework-4.7.2#适用于

封装一页可由 Windows Internet Explorer、NavigationWindow 和 Frame 导航到和承载的内容。

3.2、用法

     由以上可以知道,Page可以被NavigationWindow 和 Frame加载。但是不同的方法,有缺点不一样。请参考:

https://blog.youkuaiyun.com/xpj8888/article/details/83022627

3.2.1、Frame.Navigate导航举例

<Window>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="40"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <WrapPanel VerticalAlignment="Center">
            <Button Name="btnA" Height="30" Width="60" Margin="5" Click="btnA_Click">页面A</Button>
            <Button Name="btnB" Height="30" Width="60" Click="btnB_Click">页面B</Button>
        </WrapPanel>
        <Frame Name="frmMain" NavigationUIVisibility="Hidden"></Frame>
    </Grid>
</Window>
        private void btnA_Click(object sender, RoutedEventArgs e)
        {
            //注意:这里使用Navigate,不用Source,具体区别自己可以试试
            this.frmMain.Navigate(new Uri("PageA.xaml", UriKind.Relative));
        }

        private void btnB_Click(object sender, RoutedEventArgs e)
        {
            this.frmMain.Navigate(new Uri("PageA.xaml", UriKind.Relative));
        }

3.2.2、Frame.Source加载

参考:https://blog.youkuaiyun.com/lordwish/article/details/52667150

 <Frame x:Name="Frame" Height="1092" Width="1920" Source="Views/StudyPage.xaml" NavigationUIVisibility="Hidden" Panel.ZIndex="1"/>

3.2.3、Frame.Content加载

https://blog.youkuaiyun.com/lordwish/article/details/52667150

private void btnA_Click(object sender, RoutedEventArgs e)
        {
            PageA a = new PageA();
            this.frame.Content = a;
            a.ParentWindow = this;
        }

 

WPF中,要在个窗口(Window)中添加UserControl,你可以按照以下步骤操作: 1. 首先,确保你已经有个设计好的UserControl XAML文件,例如`MyUserControl.xaml`。在这个文件中,声明你的UI结构,包括标签、文本框或者其他控件。 ```xml <UserControl x:Class="YourNamespace.MyUserControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Grid> <!-- 在这里放置你的控件 --> <Label Content="这是UserControl"/> </Grid> </UserControl> ``` 2. 在你的窗体(Window)的XAML文件中,找到`<Grid>`或其他容器元素,然后添加个新的`UserControl`实例作为其子项。例如,如果在窗体的内容区域(`<ContentControl>`)中添加UserControl,可以这样做: ```xml <Window x:Class="YourNamespace.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow"> <Grid> <ContentControl Name="contentControl"> <local:MyUserControl/> </ContentControl> </Grid> </Window> ``` 这里的`<local:MyUserControl>`应该替换为你自定义的UserControl全名。 3. 最后,在对应的`.cs`文件中,你可以通过窗口的Name属性来引用`ContentControl`并访问其中的UserControl: ```csharp public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); MyUserControl uc = contentControl.Content as MyUserControl; if (uc != null) { uc.Message = "Hello from parent window"; // 如果有属性Message,可以在这里赋值 } } private void Button_Click(object sender, RoutedEventArgs e) { // 这里可以触发UserControl内部的事件或方法 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值