C# 同步第二个窗口大小以匹配主窗口大小

C# 同步第二个窗口大小以匹配主窗口大小,c#,wpf,resize,sync,C#,Wpf,Resize,Sync,我尝试在主窗口属性的ResizeMode中导出资源,认为数据可能与我的Window2 ResizeMode属性绑定,但它与抓取和拖动位置/值不匹配,它只与属性值匹配,在本例中是我分配给主窗口的“CanResizeWithGrip”。因此,我最终为windows和Window2都设置了一个夹点,该夹点与主窗口的大小不匹配。我想在单击并拖动主窗口上的调整大小夹点时自动缩小/放大我的Window2。我无法真正理解改变了位置或大小的手柄,以及在这种情况下应该如何使用它们。 我的主窗口有一个带有VLC插件

我尝试在主窗口属性的ResizeMode中导出资源,认为数据可能与我的Window2 ResizeMode属性绑定,但它与抓取和拖动位置/值不匹配,它只与属性值匹配,在本例中是我分配给主窗口的“CanResizeWithGrip”。因此,我最终为windows和Window2都设置了一个夹点,该夹点与主窗口的大小不匹配。我想在单击并拖动主窗口上的调整大小夹点时自动缩小/放大我的Window2。我无法真正理解改变了位置或大小的手柄,以及在这种情况下应该如何使用它们。 我的主窗口有一个带有VLC插件的视频文件提要,我的Window2有一个透明的背景和叠加切换按钮以及一个退出按钮。如果有人能提供帮助,任何建议/明确的例子都会有所帮助

主窗口:

namespace VLC_Test
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
  public partial class MainWindow : Window
  {
    AxAXVLC.AxVLCPlugin vlcPlayer = new AxAXVLC.AxVLCPlugin();

    public MainWindow()
    {
        InitializeComponent();
        WFH1.Child = vlcPlayer;           

    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        Window2 win2 = new Window2();
        win2.Show();

        string file1 = @"C:\Users\Username\Desktop\drop.avi";

        vlcPlayer.addTarget("file:///" + file1, null, AXVLC.VLCPlaylistMode.VLCPlayListReplaceAndGo, 0);
        vlcPlayer.play();
    }    
  }
}
namespace VLC_测试
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
AxAXVLC.AxVLCPlugin vlcPlayer=新的AxAXVLC.AxVLCPlugin();
公共主窗口()
{
初始化组件();
WFH1.Child=vlcPlayer;
}
已加载私有无效窗口(对象发送器、路由目标)
{
Window2 win2=新的Window2();
win2.Show();
字符串file1=@“C:\Users\Username\Desktop\drop.avi”;
添加目标(“文件://“+file1,null,AXVLC.VLCPlaylistMode.VLCPlayListReplaceAndGo,0);
vlcPlayer.play();
}    
}
}
XAML:


窗口2:

namespace VLC_Test
{
/// <summary>
/// Interaction logic for Window2.xaml
/// </summary>
  public partial class Window2 : Window
  {

    public Window2()
    {
        InitializeComponent();
    }



    private void Window_Loaded(object sender, RoutedEventArgs e)
    {

    }

    private void button2_Click(object sender, RoutedEventArgs e)
    {

       this.Close();
       App.Current.Shutdown();
    }

  }
}
namespace VLC_测试
{
/// 
///Window2.xaml的交互逻辑
/// 
公共部分类Window2:Window
{
公共窗口2()
{
初始化组件();
}
已加载私有无效窗口(对象发送器、路由目标)
{
}
私有无效按钮2\u单击(对象发送者,路由目标)
{
这个。关闭();
App.Current.Shutdown();
}
}
}
XAML:


我只需使用SizeChanged事件。更改主窗口XAML以包含对事件处理程序的调用。(同样,如果要在移动主窗口时将两个窗口保持在一起,请使用LocationChanged事件,如图所示):


然后在主窗口的cs文件中,实现该事件。请注意,我在窗口上保留了一个变量来存储Window2对象,这样我就可以在加载它之后再引用它

namespace VLC_Test
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
  public partial class MainWindow : Window
  {
    AxAXVLC.AxVLCPlugin vlcPlayer = new AxAXVLC.AxVLCPlugin();
    Window2 win2;

    public MainWindow()
    {
        InitializeComponent();
        WFH1.Child = vlcPlayer;           

    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        CreateWindow2Overlay();

        string file1 = @"C:\Users\Username\Desktop\drop.avi";

        vlcPlayer.addTarget("file:///" + file1, null,     AXVLC.VLCPlaylistMode.VLCPlayListReplaceAndGo, 0);
        vlcPlayer.play();
    }  

    private void CreateWindow2Overlay()
    {
        win2 = new Window2();
        win2.Left = Left;
        win2.Top = Top;
        win2.Width = Width;
        win2.Height = Height;
        win2.Owner = this;
        win2.Show();
    }  

    private void Window_Resize(object sender, SizeChangedEventArgs e)
    {
        if (win2 != null)
        {
            win2.Height = e.NewSize.Height;
            win2.Left = Left;
            win2.Width = e.NewSize.Width;
            win2.Top = Top;
        }
    }

    private void Window_Moved(object sender, EventArgs e)
    {
        if (win2 != null)
        {
            win2.Left = Left;
            win2.Top = Top;
        }
    }
  }
}
namespace VLC_测试
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
AxAXVLC.AxVLCPlugin vlcPlayer=新的AxAXVLC.AxVLCPlugin();
window2win2;
公共主窗口()
{
初始化组件();
WFH1.Child=vlcPlayer;
}
已加载私有无效窗口(对象发送器、路由目标)
{
CreateWindow2Overlay();
字符串file1=@“C:\Users\Username\Desktop\drop.avi”;
添加目标(“文件://“+file1,null,AXVLC.VLCPlaylistMode.VLCPlayListReplaceAndGo,0);
vlcPlayer.play();
}  
私有void CreateWindow2Overlay()
{
win2=新窗口2();
win2.Left=左;
win2.Top=Top;
win2.Width=Width;
win2.Height=Height;
win2.Owner=this;
win2.Show();
}  
私有无效窗口\调整大小(对象发送器,SizeChangedEventArgs e)
{
如果(win2!=null)
{
win2.Height=e.NewSize.Height;
win2.Left=左;
win2.Width=e.NewSize.Width;
win2.Top=Top;
}
}
私有无效窗口已移动(对象发送方、事件参数)
{
如果(win2!=null)
{
win2.Left=左;
win2.Top=Top;
}
}
}
}
对主窗口代码所做的所有更改。我没有更改Window2的cs或xaml

此解决方案在VisualStudio2010中进行了测试。请注意,我添加了CreateWindow2Overlay方法,用于设置第二个窗口。它专门将Window2的所有者设置为此(MainWindow),以便将Window2放在MainWindow的前面

需要明确的是,此更改解决的问题是: 1.将Window2对象放在主窗口的顶部 2.调整MainWindow的大小时更改Window2的大小

如果你的要求中有我遗漏的部分,请毫不犹豫地指出


我希望这对您有所帮助。

这可能是您所需要的,而且我认为除非您有一个调整窗口大小的示例,否则这是行不通的。触发器和事件触发器不只是更改框架元素外观的一个bool吗?不动态更改大小属性。。。??如果可能的话,我不知道该怎么做。第二个窗口应该与主窗口的大小保持同步,并且始终覆盖主窗口?是否有一些驱动因素导致必须使用单独的窗口,而不仅仅是将第二个窗口的内容放置在主窗口中,而不是将已经在主窗口中的内容放置在主窗口中?是的,有很好的原因说明必须这样做。因为WindowsFormsHost本身不能有任何内容。至少在WPF c#2010中,你不能在windowsformshost上拖动一个按钮,并期望在运行应用程序时看到该按钮。基于数小时的研究,我还没有找到比在顶部加上我的线条和按钮的透明窗口更好/更简单的解决方案。是的,我希望透明窗口始终位于主窗口的顶部。我已逐字实现了您的建议,但它对我不起作用,我使用的是Visual Studio 2010。没有出现错误,主窗口仍然位于第二个窗口的顶部,并且调整大小未应用于第二个窗口
<Window x:Class="VLC_Test.Window2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window2" Height="495" Width="550"
    WindowStartupLocation="Manual" 
    Top="0" Left="7" AllowsTransparency="True" WindowStyle="None" Topmost="True" >

<Window.Background>
    <SolidColorBrush Opacity="0" />
</Window.Background>

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</Window.Resources>

<Grid Width="Auto" Height="Auto">
    <ToggleButton Content="Crosshair" Height="39" HorizontalAlignment="Right" Margin="0,0,125,12" Name="Button1" VerticalAlignment="Bottom" Width="58" Click="button1_Click" IsChecked="False" DataContext="{Binding}"/>
    <Button Content="Exit" Height="39" HorizontalAlignment="Right" Margin="0,0,49,12" Name="button2" VerticalAlignment="Bottom" Width="58" Click="button2_Click" />

    <Canvas Background="Transparent" Height="200" Width="200" HorizontalAlignment="Center" Margin="0,0,0,0" Name="Canvas1" VerticalAlignment="Center" Visibility="{Binding IsChecked, ElementName=Button1, Converter={StaticResource BooleanToVisibilityConverter}}">
        <Line X1="100" Y1="0" X2="100" Y2="75" Stroke="Red" StrokeThickness="0.95" />
        <!--Top long vertical line> /-->
        <Line X1="100" Y1="95" X2="100" Y2="105" Stroke="Red" StrokeThickness="0.95" />
        <!--Crosshair vertical line> /-->
        <Line X1="100" Y1="125" X2="100" Y2="200" Stroke="Red" StrokeThickness="0.95" />
        <!--Bottom long vertical line> /-->
        <Line X1="0" Y1="100" X2="75" Y2="100" Stroke="Red" StrokeThickness="0.75" />
        <!--Left long horizontal line> /-->
        <Line X1="95" Y1="100" X2="105" Y2="100" Stroke="Red" StrokeThickness="0.75" />
        <!--Crosshair horizontal line> /-->
        <Line X1="125" Y1="100" X2="200" Y2="100" Stroke="Red" StrokeThickness="0.75" />
    </Canvas>

  </Grid>

</Window>
<Window x:Class="VLC_Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" SizeToContent="WidthAndHeight"
    WindowStartupLocation="Manual" 
    Top="0" Left="7" AllowsTransparency="False" WindowStyle="None" Loaded="Window_Loaded" Topmost="True" ShowInTaskbar="False" BorderThickness="0" ResizeMode="CanResizeWithGrip"
    SizeChanged="Window_Resize" LocationChanged="Window_Moved">

    <Window.Background>
        <SolidColorBrush Opacity="0" Color="White"/>
    </Window.Background>


    <Grid Width="Auto" Height="Auto">
        <WindowsFormsHost Height="495" Width="550" HorizontalAlignment="Left" Name="WFH1" VerticalAlignment="Top" Margin="-11,-24,0,0" ChildChanged="WFH1_ChildChanged" />                
    </Grid>
</Window>
namespace VLC_Test
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
  public partial class MainWindow : Window
  {
    AxAXVLC.AxVLCPlugin vlcPlayer = new AxAXVLC.AxVLCPlugin();
    Window2 win2;

    public MainWindow()
    {
        InitializeComponent();
        WFH1.Child = vlcPlayer;           

    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        CreateWindow2Overlay();

        string file1 = @"C:\Users\Username\Desktop\drop.avi";

        vlcPlayer.addTarget("file:///" + file1, null,     AXVLC.VLCPlaylistMode.VLCPlayListReplaceAndGo, 0);
        vlcPlayer.play();
    }  

    private void CreateWindow2Overlay()
    {
        win2 = new Window2();
        win2.Left = Left;
        win2.Top = Top;
        win2.Width = Width;
        win2.Height = Height;
        win2.Owner = this;
        win2.Show();
    }  

    private void Window_Resize(object sender, SizeChangedEventArgs e)
    {
        if (win2 != null)
        {
            win2.Height = e.NewSize.Height;
            win2.Left = Left;
            win2.Width = e.NewSize.Width;
            win2.Top = Top;
        }
    }

    private void Window_Moved(object sender, EventArgs e)
    {
        if (win2 != null)
        {
            win2.Left = Left;
            win2.Top = Top;
        }
    }
  }
}