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

本文关键字:窗口大小 第二个 同步 | 更新日期: 2023-09-27 18:12:53

我已经尝试在主窗口属性的ResizeMode中导出资源,认为数据可以与我的Window2 ResizeMode属性绑定,但它不匹配抓取和拖动位置/值,它只是匹配属性值,在这种情况下是'CanResizeWithGrip',我已经分配给主窗口。所以我最终选择了两个窗口的握把,而Window2不匹配主窗口的大小调整。当我点击并拖动主窗口上的调整大小手柄时,我想自动缩小/扩大我的Window2。我无法真正掌握LocationChanged或sizechange句柄,以及它们应该如何在这种情况下使用。我的主窗口有一个带有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();
    }    
  }
}
XAML:

<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">

<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>

Window2:

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();
    }
  }
}
XAML:

<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>

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

我将简单地使用SizeChanged事件。更改主窗口XAML以包含对事件处理程序的调用。(类似地,如果你想在主窗口移动时保持两个窗口在一起,使用LocationChanged事件,也显示):

<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>

然后在MainWindow的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;
        }
    }
  }
}

对主窗口代码所做的所有更改。我没有更改windows 2的cs或xaml。

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

要清楚,这个变化解决的问题是:1. 把Window2对象放在主窗口的顶部2. 当主窗口大小调整时,更改窗口大小

如果你的要求中有我遗漏的部分,请及时指出来。

我希望这对你有帮助