2012-08-02 18 views
6

Tengo una aplicación con dos ventanas XAML/WPF (derivadas de NavigationWindow), cada ventana contiene un UserControl principal, en el que se ubican todos los controles secundarios. En una de las ventanas, me gustaría mostrar el contenido de la segunda ventana (realmente solo el UserControl principal), de la misma forma que un televisor de imagen en imagen. De esta forma, el usuario podría ver la primera ventana y ver lo que sucede en la segunda ventana al mismo tiempo. Tenga en cuenta que no quiero dos copias independientes del UserControl de esta segunda ventana (eso sería fácil), sino reflejar el contenido de la segunda ventana en la primera ventana.¿Puedo duplicar una ventana XAML/WPF en una segunda ventana, como un televisor de imagen en imagen?

Esto es vagamente similar a las vistas previas en miniatura de la barra de tareas de Windows 7, por lo que creo que debe ser factible. Idealmente, sin embargo, también me gustaría poder interactuar con esa ventana-en-una-ventana, de la misma manera que lo haría si tuviera que levantar la ventana original.

Esto es similar a this question, excepto que me gustaría copiar solo una ventana de la misma aplicación, en lugar de todo el escritorio. También es similar al this question, pero necesito un poco más de mano, ya que no estoy muy familiarizado con C#/WPF. Algunos fragmentos de código serían geniales.

¡Gracias de antemano!

+0

Es posible que pueda "secuestrar" el contenido de la segunda ventana y ponerlos en su control "PiP". Cuando ya no se necesita el PiP, vuelva a conectar el contenido a la ventana si es necesario. –

Respuesta

0

Utilice un pincel visual como relleno en un rectángulo.

Sin embargo, no podrá interactuar con él ... pero así es como se logran las miniaturas de vista previa en la barra de tareas.

<Grid HorizontalAlignment="Left" Name="A" Height="100" Width="100"> 
    <Grid.Background> 
     <SolidColorBrush Opacity="0" Color="White"/> 
    </Grid.Background> 
    <!-- Contents --> 
</Grid> 


<Rectangle Name="RA" VerticalAlignment="Top" Width="100" Height="100" HorizontalAlignment="Left" Stroke="Black"> 
    <Rectangle.Fill> 
     <!-- Creates the reflection. --> 
     <VisualBrush AutoLayoutContent="True" Visual="{Binding ElementName=A}" ViewboxUnits="RelativeToBoundingBox" ViewportUnits="RelativeToBoundingBox" Stretch="Fill" AlignmentX="Left" AlignmentY="Top" Viewport="0,0,1,1" Viewbox="0,0,1,1" TileMode="None"> 
     </VisualBrush> 
    </Rectangle.Fill> 
</Rectangle> 

Para interactuar, habría que unir todas las propiedades de una pantalla idéntica, y utilizar un diseño de transformar para que se contraiga.

<StackPanel> 
    <Grid> 
     <TextBox Name="A"/> 
    </Grid> 
    <Grid> 
     <Grid.LayoutTransform> 
      <ScaleTransform CenterX=".5" CenterY=".5" ScaleX=".25" ScaleY=".25"/> 
     </Grid.LayoutTransform> 
     <TextBox Name="B" Text="{Binding ElementName=A, Path=Text, UpdateSourceTrigger=PropertyChanged}"/> 
    </Grid> 
</StackPanel> 
3

Utilice un pincel visual. No será interactivo, pero parece ajustarse a tus necesidades.

Pegue este código en Kaxaml para verlo en acción.

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Page.Triggers> 
     <EventTrigger RoutedEvent="Page.Loaded"> 
      <EventTrigger.Actions> 
       <BeginStoryboard> 
        <Storyboard Storyboard.TargetName="sampleAnimation" Storyboard.TargetProperty="(FrameworkElement.RenderTransform).(RotateTransform.Angle)"> 
         <DoubleAnimation Duration="00:00:10" RepeatBehavior="Forever" To="-360"> 
          <DoubleAnimation.EasingFunction> 
           <ElasticEase/> 
          </DoubleAnimation.EasingFunction> 
         </DoubleAnimation> 
        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger.Actions> 
     </EventTrigger> 
    </Page.Triggers> 
    <Page.Resources> 
     <VisualBrush x:Key="contentBrush" Stretch="None" Visual="{Binding ElementName=content}"/> 
    </Page.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <TextBlock FontSize="25" Text="Content to mirror:"/> 
     <Grid 
      x:Name="content" 
      Grid.Row="1" 
      Margin="5" 
      Background="#11000000" 
      ClipToBounds="True"> 
      <TextBox 
       x:Name="sampleAnimation" 
       HorizontalAlignment="Center" 
       VerticalAlignment="Center" 
       FontSize="60" 
       FontWeight="Light" 
       Foreground="Red" 
       RenderTransformOrigin="0.5,0.5" 
       Text="Hello!"> 
       <TextBox.RenderTransform> 
        <RotateTransform Angle="0"/> 
       </TextBox.RenderTransform> 
      </TextBox> 
     </Grid> 
     <TextBlock Grid.Row="2" FontSize="25" Text="Mirrored content using VisualBrush:"/> 
     <Grid Grid.Row="3" Background="{StaticResource contentBrush}"> 
     </Grid> 
    </Grid> 
</Page> 
Cuestiones relacionadas