Синхронизировать второй размер окна, чтобы соответствовать размеру основного окна

1

Я попытался экспортировать ресурс в ResizeMode свойств MainWindow, думая, что данные могут быть привязаны к моему свойству Window2 ResizeMode, но он не соответствует местоположению/значению захвата и перетаскивания, он просто соответствует значению свойства, в данном случае является " CanResizeWithGrip ', который я назначил MainWindow. Таким образом, я получаю хватку для обоих окон, а Window2 не соответствует размеру MainWindow. Я хотел бы автоматически сжимать/увеличивать окно Window2, когда я нажимаю и перетаскиваю ручку изменения размера на MainWindow. Я не смог по-настоящему понять дескрипторы LocationChanged или SizeChanged и как их следует использовать в этом случае. У моего MainWindow есть фид видеофайлов с плагином VLC, а мой Window2 имеет прозрачный фон и наложенную кнопку Toggle и кнопку Exit. Любые предложения/окончательные примеры были бы полезны, если кто-то может помочь.

MainWindow:

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>
  • 0
    Кто-нибудь может помочь?
  • 0
    возможно Trigger - это то, что вам нужно, а также EventTrigger
Показать ещё 3 комментария
Теги:
wpf
resize
sync

1 ответ

1
Лучший ответ

Я просто использовал событие SizeChanged. Измените свой MainWindow XAML, чтобы включить вызов обработчика событий. (Аналогично, если вы хотите, чтобы оба окна были объединены при перемещении MainWindow, используйте также событие 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>

Затем в вашем файле cs для MainWindow, выполните событие. Обратите внимание, что я сохранил переменную в окне, чтобы сохранить ваш объект 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;
        }
    }
  }
}

Все изменения внесены в код для MainWindow. Я не изменил cs или xaml для Window2.

Это решение протестировано в Visual Studio 2010. Обратите внимание, что я добавил метод CreateWindow2Overlay, который устанавливает второе окно. Он специально устанавливает владельца Window2 на это (MainWindow), чтобы поставить Window2 перед MainWindow.

Чтобы быть ясным, проблемы, которые решают эти изменения, следующие: 1. Поместите объект Window2 поверх MainWindow 2. Измените размер Window2 при изменении размера MainWindow

Если какая-либо часть вашего запроса, которую я пропустил, не стесняйтесь указать на это.

Надеюсь, это вам поможет.

  • 0
    Я выполнил ваши предложения дословно, но у меня это не сработало, я использую Visual Studio 2010. Ошибок не возникало, главное окно все еще находится сверху второго окна, а изменение размера не применялось ко второму. окно, когда настроено.
  • 0
    Я был бы очень признателен, если бы вы (или кто-либо другой) могли помочь мне в этой версии.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню