none
WPF 自定义用户事件不能插入到主窗口中 RRS feed

  • 问题

  • 1.设计结构:

    2.主窗口:主窗口引入自定义用户控件windowMainControl.xaml,代码如下:

    <Window x:Class="Shanzhizi.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:windowmaincontrol="clr-namespace:Shanzhizi.Control.WindowMainControl"
            xmlns:mediaplayercontrol="clr-namespace:Shanzhizi.Control.MediaPlayerControl"
            Title="私人空间"    Width="1360" Height="740" 
            WindowStartupLocation="CenterScreen"  WindowStyle="None"
            PreviewMouseMove="Window_PreviewMouseMove">

        <Grid Name="mainwindowgrid">
            <windowmaincontrol:windowMainControl x:Name="WMC"
                LostFocus="windowMainControl_LostFocus"
                GotFocus="windowMainControl_GotFocus"
                ContextMenuOpening="windowMainControl_ContextMenuOpening" />
           <!--<mediaplayercontrol:videoPlayerControl />-->
        </Grid>
       
    </Window>

    后台代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;


    //引入控件
    using Shanzhizi.Control.WindowMainControl;

    namespace Shanzhizi
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }

           
            private void Window_PreviewMouseMove(object sender, MouseEventArgs e)
            {
                // 通过鼠标焦点获自定义用户控件自动显示与隐藏
                //假设标题栏在0和10之间
                if (e.GetPosition(this).Y >= 0 && e.GetPosition(this).Y < 35)
                {
                    if (WMC.Visibility != Visibility.Visible)
                    {
                        WMC.Visibility = Visibility.Visible;
                    }
                }
                else
                {
                    WMC.Visibility = Visibility.Collapsed;
                }
            }
            //获得焦点
            private void windowMainControl_LostFocus(object sender, RoutedEventArgs e)
            {
                WMC.Visibility = Visibility.Collapsed;
            }

            //失去焦点
            private void windowMainControl_GotFocus(object sender, RoutedEventArgs e)
            {
                WMC.Visibility = Visibility.Visible;
            }
            //窗体事件焦点
            private void windowMainControl_ContextMenuOpening(object sender, ContextMenuEventArgs e)
            {
                WMC.Visibility = Visibility.Visible;
            }
        }
    }

    3.自定义用户控件windowMainControl.xaml中绑定一按钮事件Click="WindowMainMenu"及后台程序,代码如下:

    <UserControl x:Class="Shanzhizi.Control.WindowMainControl.windowMainControl"
                 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="35" d:DesignWidth="1354"
                 MaxHeight="35" MaxWidth="1354" HorizontalAlignment="Left" VerticalAlignment="Top">
        <UserControl.Resources>
            <ResourceDictionary Source="windowMainControlDictionary.xaml" />
        </UserControl.Resources>
        <Grid >
            <DockPanel Style="{StaticResource DockPanelResource}">
                <StackPanel Style="{StaticResource StackPanelLeftResource}" >
                    <Button >
                        <Image Source="/Shanzhizi;component/Control/ico/home.png" />
                    </Button>
                    <Button >
                        <Image Source="/Shanzhizi;component/Control/ico/stuff.png" />
                    </Button>
                    <Button >
                        <Image Source="/Shanzhizi;component/Control/ico/TN_psd.JPG" />
                    </Button>
                    <Button >
                        <Image Source="/Shanzhizi;component/Control/ico/album.tif" />
                    </Button>
                    <Button >
                        <Image Source="/Shanzhizi;component/Control/ico/RTF.File.png" />
                    </Button>
                    <Button >
                        <Image Source="/Shanzhizi;component/Control/ico/PDF.File.png" />
                    </Button>
                    <Button >
                        <Image Source="/Shanzhizi;component/Control/ico/IExplorer.png" />
                    </Button>
                    <Button >
                        <Image Source="/Shanzhizi;component/Control/ico/mWorld_green.png" />
                    </Button>
                    <Button Click="WindowMainMenu">
                        <!---->
                        <Image Source="/Shanzhizi;component/Control/ico/Musica_min.png" />
                    </Button>
                    <Button x:Name="movic">
                        <Image Source="/Shanzhizi;component/Control/ico/mWorld_cd_Yellow.png" />
                    </Button>
                    <Button >
                        <Image Source="/Shanzhizi;component/Control/ico/applications.png" />
                    </Button>
                </StackPanel>
                <StackPanel Style="{StaticResource StackPanelRightResource}" >
                    <Button Click="MinWindow">
                        <Image Source="/Shanzhizi;component/Control/ico/-.png" />
                    </Button>
                    <Button Click="FullWindow">
                        <Image Source="/Shanzhizi;component/Control/ico/+.png" />
                    </Button>
                    <Button Click="CloseWindow">
                        <Image Source="/Shanzhizi;component/Control/ico/delete.png" />
                    </Button>
                </StackPanel>
            </DockPanel>
        </Grid>
    </UserControl>

    后台代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;

    //引用Media控件
    using Shanzhizi.Control.MediaPlayerControl;
    using Shanzhizi;

    namespace Shanzhizi.Control.WindowMainControl
    {
        /// <summary>
        /// WindowMainControl.xaml 的交互逻辑
        /// </summary>
        public partial class windowMainControl : UserControl
        {
            public windowMainControl()
            {
                InitializeComponent();
            }

            ///////////////////////////////////////窗口状态事件//////////////////////////////////////
            private void CloseWindow(object sender, RoutedEventArgs e)
            {
                Application.Current.MainWindow.Close();
            }

            private void FullWindow(object sender, RoutedEventArgs e)
            {
                Application.Current.MainWindow.WindowState = WindowState.Maximized;
            }

            private void MinWindow(object sender, RoutedEventArgs e)
            {
                Application.Current.MainWindow.WindowState = WindowState.Minimized;
            }

           

            ///////////////////////////////////////窗口状态事件//////////////////////////////////////

            ///////////////////////////////////////主菜单操作事件//////////////////////////////////////
           //声明控件
            videoPlayerControl mediamlayermontrol = new videoPlayerControl();
           MainWindow mainwindow = new MainWindow();

            private void WindowMainMenu(object sender, RoutedEventArgs e)
            {
                mainwindow.mainwindowgrid.Children.Add(mediamlayermontrol);
           }
             
          
            ///////////////////////////////////////主菜单操作事件//////////////////////////////////////
        }
    }

    3.通过主窗口中引入的自定义用户按钮事件,将videoPlayerControl.xaml用户控件页面插入到主窗口Grid中,不能编译,无法调试,请高手解决。

    注:通过主窗口中引入的自定义用户按钮事件,将videoPlayerControl.xaml用户控件页面插入到主窗口Grid()中。

    • 已更改类型 粗俗人 2012年5月24日 18:39
    • 已更改类型 粗俗人 2012年5月24日 18:41
    2012年5月24日 18:37

答案

  • 明显的错误,你在一个用户控件中又创建了新的主窗体 MainWindow mainwindow = new MainWindow(); ,然后你还没有Show他,就直接在他的里面加一个 videoPlayerControl。这个新的主窗体和原来的包含 windowMainControl 的那个是不同的两个窗体,没有联系。

    我把你的问题简化一下,写了个简单的例子,你看下能否理解他:

    一个主窗体类,两个用户控件,在主窗体中已经有了一个用户控件,然后我们可以点击这个控件中的按钮将另一个用户控件加入到主窗体。

    MainWindow.xaml:

    <Window x:Class="WpfApplication8.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication8"
            Title="MainWindow" Height="350" Width="525">
      <StackPanel x:Name="panel">
        <local:UserControl1/>
      </StackPanel>
    </Window>
    

    UserControl1.xaml

    <UserControl x:Class="WpfApplication8.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" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
      <Grid>
        <Button Content="UserControl 1 Button -- Add a new UserControl 2 into MainWindow" Click="Button_Click"/>
      </Grid>
    </UserControl>
    

    UserControl1.xaml.cs:

      public partial class UserControl1 : UserControl
      {
        public UserControl1()
        {
          InitializeComponent();
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
          (App.Current.MainWindow as MainWindow).panel.Children.Add(new UserControl2());
        }
      }


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 粗俗人 2012年5月26日 3:57
    2012年5月25日 8:46
    版主
  • 明显的错误,你在一个用户控件中又创建了新的主窗体 MainWindow mainwindow = new MainWindow(); ,然后你还没有Show他,就直接在他的里面加一个 videoPlayerControl。这个新的主窗体和原来的包含 windowMainControl 的那个是不同的两个窗体,没有联系。

    我把你的问题简化一下,写了个简单的例子,你看下能否理解他:

    一个主窗体类,两个用户控件,在主窗体中已经有了一个用户控件,然后我们可以点击这个控件中的按钮将另一个用户控件加入到主窗体。

    MainWindow.xaml:

    <Window x:Class="WpfApplication8.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication8"
            Title="MainWindow" Height="350" Width="525">
      <StackPanel x:Name="panel">
        <local:UserControl1/>
      </StackPanel>
    </Window>

    UserControl1.xaml

    <UserControl x:Class="WpfApplication8.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" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
      <Grid>
        <Button Content="UserControl 1 Button -- Add a new UserControl 2 into MainWindow" Click="Button_Click"/>
      </Grid>
    </UserControl>

    UserControl1.xaml.cs:

      public partial class UserControl1 : UserControl
      {
        public UserControl1()
        {
          InitializeComponent();
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
          (App.Current.MainWindow as MainWindow).panel.Children.Add(new UserControl2());
        }
      }
    经过调试,可成功运行,并能达到预期效果,但(App.Current.MainWindow as MainWindow)部分程序不能理解,请Bob Bao给予解释,谢谢。
    • 已标记为答案 粗俗人 2012年5月26日 3:57
    2012年5月25日 14:13

全部回复

  • 明显的错误,你在一个用户控件中又创建了新的主窗体 MainWindow mainwindow = new MainWindow(); ,然后你还没有Show他,就直接在他的里面加一个 videoPlayerControl。这个新的主窗体和原来的包含 windowMainControl 的那个是不同的两个窗体,没有联系。

    我把你的问题简化一下,写了个简单的例子,你看下能否理解他:

    一个主窗体类,两个用户控件,在主窗体中已经有了一个用户控件,然后我们可以点击这个控件中的按钮将另一个用户控件加入到主窗体。

    MainWindow.xaml:

    <Window x:Class="WpfApplication8.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication8"
            Title="MainWindow" Height="350" Width="525">
      <StackPanel x:Name="panel">
        <local:UserControl1/>
      </StackPanel>
    </Window>
    

    UserControl1.xaml

    <UserControl x:Class="WpfApplication8.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" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
      <Grid>
        <Button Content="UserControl 1 Button -- Add a new UserControl 2 into MainWindow" Click="Button_Click"/>
      </Grid>
    </UserControl>
    

    UserControl1.xaml.cs:

      public partial class UserControl1 : UserControl
      {
        public UserControl1()
        {
          InitializeComponent();
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
          (App.Current.MainWindow as MainWindow).panel.Children.Add(new UserControl2());
        }
      }


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 粗俗人 2012年5月26日 3:57
    2012年5月25日 8:46
    版主
  • 明显的错误,你在一个用户控件中又创建了新的主窗体 MainWindow mainwindow = new MainWindow(); ,然后你还没有Show他,就直接在他的里面加一个 videoPlayerControl。这个新的主窗体和原来的包含 windowMainControl 的那个是不同的两个窗体,没有联系。

    我把你的问题简化一下,写了个简单的例子,你看下能否理解他:

    一个主窗体类,两个用户控件,在主窗体中已经有了一个用户控件,然后我们可以点击这个控件中的按钮将另一个用户控件加入到主窗体。

    MainWindow.xaml:

    <Window x:Class="WpfApplication8.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication8"
            Title="MainWindow" Height="350" Width="525">
      <StackPanel x:Name="panel">
        <local:UserControl1/>
      </StackPanel>
    </Window>

    UserControl1.xaml

    <UserControl x:Class="WpfApplication8.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" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
      <Grid>
        <Button Content="UserControl 1 Button -- Add a new UserControl 2 into MainWindow" Click="Button_Click"/>
      </Grid>
    </UserControl>

    UserControl1.xaml.cs:

      public partial class UserControl1 : UserControl
      {
        public UserControl1()
        {
          InitializeComponent();
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
          (App.Current.MainWindow as MainWindow).panel.Children.Add(new UserControl2());
        }
      }
    经过调试,可成功运行,并能达到预期效果,但(App.Current.MainWindow as MainWindow)部分程序不能理解,请Bob Bao给予解释,谢谢。
    • 已标记为答案 粗俗人 2012年5月26日 3:57
    2012年5月25日 14:13
  • App.Current.MainWindow 一个WPF应用会有一个主窗体,他可以使你在任何时候都可以从其他窗体或者组件中获得你的主窗体,但是你可以看到,这个App.Current.MainWindow 返回的是一个Window类型,并不是你的MainWindow类型,当然我们知道他肯定是一个MainWindow对象在这里,所以我们可以做一次as操作,将这个返回值转换成MainWindow类型对象,即我们获得了你的这个应用的主窗体。 而不是去新建一个MainWindow。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月28日 3:07
    版主