zoukankan      html  css  js  c++  java
  • WPF 使用用户控件UserControl来切换界面(一)

    程序集整体框架如下

     主窗体UI文件MainWindow.xaml

    <Window x:Class="WpfApp1.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:WpfApp1"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
    
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="200"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Border Grid.Column ="0"  BorderThickness="3" BorderBrush="Gray">
                <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="50"/>
                        <RowDefinition Height="50"/>
                    </Grid.RowDefinitions>
                    <Button Content="用户控件1" Click="ButtonClick1" Margin="3"/><!--使用按键事件来切换-->
                    <Button Content="用户控件2" Click="ButtonClick2" Margin="3" Grid.Row="1"/>
                </Grid>
            </Border>
    
            <Border Grid.Column ="1" BorderBrush="Gray" BorderThickness="3">
                <ContentPresenter  Content="{Binding UserContent}"/><!--使用内容呈现器来显示用户控件界面-->
            </Border>
        </Grid>
    </Window>
    MainWindow.xaml

     主窗体后台代码MainWindow.xaml.cs如下

    using System.ComponentModel;
    using System.Windows;
    using System.Windows.Controls;
    
    
    namespace WpfApp1
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window, INotifyPropertyChanged
        {
            
            private UserControl1 UserControl1 = new UserControl1();//实例化用户控件1
            private UserControl2 UserControl2 = new UserControl2();//实例化用户控件2
    
            public MainWindow()
            {
                InitializeComponent();
                DataContext = this;
            }
    
            private void ButtonClick1(object sender, RoutedEventArgs e)
            {
                UserContent = UserControl1;//内容呈现器绑定的UserContent赋值给用户控件1
            }
    
            private void ButtonClick2(object sender, RoutedEventArgs e)
            {
                UserContent = UserControl2;//内容呈现器绑定的UserContent赋值给用户控件2
            }
    
            private UserControl _content;
            //内容呈现器绑定到UserContent
            public UserControl UserContent
            {
                get { return _content; }
                set
                {
                    _content = value;
                    OnPropertyChanged("UserContent");
                }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
            protected virtual void OnPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                    PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    MainWindow.xaml.cs

    用户控件UserControl1.xaml UI文件如下

    <UserControl x:Class="WpfApp1.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:WpfApp1"
                 mc:Ignorable="d" 
                 d:DesignHeight="450" d:DesignWidth="800">
        <StackPanel>
            <Label  Content="用户界面1" HorizontalAlignment="Center"/>
            <Label Name="myLabel" Content="0" HorizontalAlignment="Center"/>
            <Button Content="计数" Click="Button_Click"/>
        </StackPanel>
    </UserControl>
    UserControl1.xaml

    其后台代码

    using System.Windows;
    using System.Windows.Controls;
    
    namespace WpfApp1
    {
        /// <summary>
        /// UserControl1.xaml 的交互逻辑
        /// </summary>
        public  partial class UserControl1 : UserControl
        {
            private int i = 0;
            public UserControl1()
            {
                InitializeComponent();
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                i++;
                myLabel.Content = i.ToString();
            }
        }
    }
    UserControl1.xaml.cs

    用户控件2与其类似,整体效果如下

     

     源码下载地址:https://github.com/lizhiqiang0204/UserControl-change-interface

    如果在用户界面1增加一个清空计数按键,点击一下立刻清空用户界面1和用户界面2的计数,此时就需要用绑定来实现跨文件访问更改其属性。

    用户界面1前台代码增加一个清空计数按键,并且把标签内容绑定到myStr字符串, 内容如下

        <StackPanel>
            <Label  Content="用户界面1" HorizontalAlignment="Center"/>
            <Label Name="myLabel" Content="{Binding myStr}" HorizontalAlignment="Center"/>
            <Button Content="计数" Click="Button_Click"/>
            <Button Content="清空计数" Click="btn_Clear_Click"/>
        </StackPanel>

    用户界面1后台代码如下

    using System;
    using System.ComponentModel;
    using System.Windows;
    using System.Windows.Controls;
    
    namespace WpfApp3
    {
        /// <summary>
        /// UserControl1.xaml 的交互逻辑
        /// </summary>
        public partial class UserControl1 : UserControl
        {
            public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;//静态事件处理属性更改
            public static int i = 0;
    
            private static string _myStr = "0";
            public static string myStr //Label 标签内容绑定到这个myStr字符串
            {
                get { return _myStr; }
                set
                {
                    _myStr = value;
                    StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(nameof(myStr)));//异步更新属性
                }
            }
            public UserControl1()
            {
                InitializeComponent();
                DataContext = this;//设置绑定数据的上下文为UserControl1类
            }
    
            //累加按键处理事件
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                i++;//按一下数值累加一次
                myStr = i.ToString();//把累加完后的数值转换成字符串赋给标签内容值(立刻更新标签内容)
            }
    
            //清空按键处理事件
            private void btn_Clear_Click(object sender, RoutedEventArgs e)
            {
                UserControl1.i = 0;//把累加计数值清空设为0
                UserControl1.myStr = "0";//立刻更新标签内容
    
                UserControl2.i = 0;//同时把用户界面2里的累加值清空
                UserControl2.myStr = "0";//立刻更新用户界面2的标签内容
            }
        }
    }
    UserControl1.xaml.cs

    用户界面2前台代码

        <StackPanel>
            <Label  Content="用户界面2" HorizontalAlignment="Center"/>
            <Label Name="myLabel" Content="{Binding myStr}" HorizontalAlignment="Center"/>
            <Button Content="计数" Click="Button_Click"/>
            <Button Content="清空计数" Click="btn_Clear_Click"/>
        </StackPanel>

    用户界面2后台代码

    using System;
    using System.ComponentModel;
    using System.Windows;
    using System.Windows.Controls;
    
    
    namespace WpfApp3
    {
        /// <summary>
        /// UserControl2.xaml 的交互逻辑
        /// </summary>
        public partial class UserControl2 : UserControl
        {
            public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;//静态事件处理属性更改
    
            public static int i = 0;
            private static string _myStr = "0";
            public static string myStr //Label 标签内容绑定到这个myStr字符串
            {
                get { return _myStr; }
                set
                {
                    _myStr = value;
                    StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(nameof(myStr)));//异步更新属性
                }
            }
    
            public UserControl2()
            {
                InitializeComponent();
                DataContext = this;//设置绑定数据的上下文为UserControl2类
            }
            //累加按键处理事件
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                i++;//按一下数值累加一次
                myStr = i.ToString();//把累加完后的数值转换成字符串赋给标签内容值(立刻更新标签内容)
            }
    
            private void btn_Clear_Click(object sender, RoutedEventArgs e)
            {
                UserControl2.i = 0;//把累加计数值清空设为0
                UserControl2.myStr = "0";//立刻更新标签内容
    
                UserControl1.i = 0;//同时把用户界面1里的累加值清空
                UserControl1.myStr = "0";//立刻更新用户界面1的标签内容
            }
        }
    }
    UserControl2.xaml.cs

    效果如下

    源码下载地址:https://github.com/lizhiqiang0204/UserControl-change-interface2

    用Button切换页面显得不太美观,可以用自定义的数据模板来改善一下,参考此博文https://www.cnblogs.com/lizhiqiang0204/p/12617924.html

  • 相关阅读:
    【技术评网】说说豆瓣的URL设计
    在这一刻,还是忍不住满眼泪水
    装Sybase,装WAS 6.1的时候报错java.exe损坏的图象
    JasperRepor导出报表通用类
    XSS跨站攻击
    sql 脚本
    解决在无线网络下本机无法连接linux(红帽)虚拟机问题
    pl /sql导入导出表结构,表数据,sql脚本
    asp.net关于WEB端用户重复提交问题。禁用服务器控件按钮问题。
    MQ命令学习总结大全MQ常用命令
  • 原文地址:https://www.cnblogs.com/lizhiqiang0204/p/12367553.html
Copyright © 2011-2022 走看看