2013-04-09 12 views
4

Скажем, у меня есть UserControl называется MyVideoControl, расположенный в MainWindow.xaml:Как перемещать WPF UserControl из одного окна в другое?

<Window Name="_mainWindow"> 
    <Grid> 
     <MyVideoControl Name="_localVideo"/> 
    </Grid> 
</Window> 

Теперь, когда пользователь нажимает на кнопку, и я хочу, чтобы UserControl плавать на вершине MainWindow.xaml, в недавно созданного окна под названием PopUp.xaml.

<Window Name="_popUpWindow"> 
    <Grid> 
     <MyVideoControl Name="_localVideo"/> 
    </Grid> 
</Window> 

Как это сделать, поэтому весь объект перемещается? В настоящее время я использую XAML для декларативного размещения MyVideoControl внутри своих окон, но я предполагаю, что мне нужно будет делать все программно?

+0

Я не думаю, что это возможно. Вы видели эту функциональность в другом месте? Я уверен, что все элементы управления должны содержаться в одном (и только одном) окне. – Jras

+1

вы можете просто удалить пользовательский элемент управления из окна man и добавить его в новое окно, когда пользователь нажимает кнопку. – KF2

+0

@ Jras - возможно, я не был ясен. Элемент управления будет содержаться в одном (и только одном) окне ** в любой момент времени **. Поэтому в какой-то момент это будет MainWindow, но в другом случае это будет PopUpWindow. Есть только один экземпляр, но он перемещается вокруг двух окон. – Eternal21

ответ

7

Да, вы можете сделать это, удалив userControl из Mainwindow и добавив его в качестве логического дочернего элемента в любой элемент управления в окне PopupWin.

enter image description here

UserControl.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" 
      mc:Ignorable="d" 
      d:DesignHeight="100" d:DesignWidth="100"> 
    <Grid> 
     <TextBox x:Name="txtBlock1" Text="hai"/> 
    </Grid> 
</UserControl> 

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:WpfApplication1="clr-namespace:WpfApplication1" Title="MainWindow" Height="550" Width="555"> 
    <Grid> 
     <StackPanel x:Name="mainPanel" Orientation="Vertical "> 
      <Button Content="Button" Height="23" Name="button1" Width="75" Click="button1_Click" /> 
      <WpfApplication1:UserControl1 x:Name="myUserControl" /> 
     </StackPanel> 
    </Grid> 
</Window> 

PopupWin.xaml:

<Window x:Class="WpfApplication1.PopupWin" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="PopupWin" Height="300" Width="300"> 

    <StackPanel x:Name="mainPanel"/> 

</Window> 

PopupWin.xaml.CS: Expose новый конструктор принять userControl и добавить его в детстве mainPanel

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

    private UserControl control; 

    public PopupWin(UserControl control) 
     : this() 
    { 
     this.control = control; 

     this.mainPanel.Children.Add(this.control); 
    } 
} 

MainWindow.xaml.cs в На Button_Click удалить UserControl из текущего MainWindow и передать его PopupWin , в этом случае через конструктор.

private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     this.mainPanel.Children.Remove(this.myUserControl); 

     var wind = new PopupWin(this.myUserControl); 

     wind.ShowDialog(); 
    } 

Примечание: Экземпляр userControl всегда должен быть логическим ребенком только one элемента в любое время.

+1

Принимая этот ответ, потому что это хороший компромисс между тем, что все еще можно использовать XAML, и при этом не прибегать к ресурсному словарю, с очень маленьким кодом. – Eternal21

+0

@ Eternal21: С удовольствием узнал, что это помогло .. –

1

Если вы внесете UserControl ресурс, вы можете это сделать.

Пример:

App.xaml

<Application x:Class="WpfApplication10.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
     <ContentControl x:Key="sharedContent"> 
      <Label Content="StackOverFlow" /> 
     </ContentControl> 
    </Application.Resources> 
</Application> 

MainWindow

<Window x:Class="WpfApplication10.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="325" Width="422" Name="UI"> 

    <StackPanel> 
     <Button Content="Open PopUp" Click="Button_Click" /> 
     <ContentControl Content="{DynamicResource sharedContent}" /> 
    </StackPanel> 
</Window> 

Всплывающее окно

<Window x:Class="WpfApplication10.PopupWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="PopupWindow" Height="300" Width="300" xmlns:my="clr-namespace:WpfApplication10"> 
    <Grid> 
     <ContentControl Content="{DynamicResource sharedContent}" /> 
    </Grid> 
</Window> 

Результат:

enter image description hereenter image description here

1

Другой способ это может быть достигнуто, используя динамический макет ...

public partial class MainWindow : Window 
{ 
    public Button ControlToMove { get; set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 

     //create button 
     ControlToMove = new Button(); 

     //add text to button 
     ControlToMove.Content = "Click to move me to pop up window"; 

     //add a new routed event to the buttons click property 
     ControlToMove.Click += new RoutedEventHandler(MoveControlToPopUp); 

     //add control to the layout grid 
     MainGrid.Children.Add(ControlToMove); 
    } 

    //This method moves the button to a popup window 
    private void MoveControlToPopUp(object sender, RoutedEventArgs e) 
    { 
     //get the name of the control from sender 
     var control = sender as Button; 
     var controlName = control.Name; 

     //checks to see if this is the control we want moved 
     //if its not, method exits 
     if (controlName != ControlToMove.Name) return; 

     //create copy of the control 
     var copiedControl = control; 

     //remove control from existing window 
     MainGrid.Children.Remove(control); 

     //create pop up window 
     var popUpWindow = new PopUpWindow(copiedControl); 
     popUpWindow.Show(); 
    } 
} 

public class PopUpWindow : Window 
{ 
    public Grid Layout { get; set; } 
    public PopUpWindow(Button button) 
    { 
     //create a grid for the new window 
     Layout = new Grid(); 

     //add control to grid 
     Layout.Children.Add(button); 

     //add grid to window 
     this.AddChild(Layout); 
    } 
} 

}

Единственное, что я не делал там добавлял возможность перемещения затем вернитесь к главному окну, когда он щелкнут во всплывающем окне.

Смежные вопросы