Как создать второе окно, которое показывает часть главного окна - PullRequest
2 голосов
/ 07 сентября 2011

У меня есть приложение с WPF Ribbon и Grid.И мне нужно показать эту сетку не только в главном окне приложения, но и во втором окне.Эта Сетка содержит много элементов, таких как ToggleButtons, TextBoxes, Изображения.Схема кода моего приложения выглядит следующим образом:

<ribbon:RibbonWindow
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        [...]
        xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
        Title="MainWindow"
        x:Name="RibbonWindow"
        Height="870" Width="1000">

    <Grid x:Name="LayoutRoot">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <ribbon:Ribbon x:Name="Ribbon">
        [...]
        </ribbon:Ribbon>

        <Grid Background="#FF5C5C5C" Height="765" Width="986" Grid.Row="1" Margin="0,0,-2,-70" x:Name="MainGrid">
            <ToggleButton/>
            <TextBlock />
            <ToggleButton/>
            <Rectangle />
            [...]
         </Grid>

    </Grid>
</ribbon:RibbonWindow>

MainGrid - это Сетка, которую я хочу показать во втором окне.Это может быть только вид этой сетки.Но когда я что-то изменяю в первом окне, например, пишу что-то в TextBox или нажимаю ToggleButton, мне нужно, чтобы это было видно и на втором экране.

1 Ответ

3 голосов
/ 07 сентября 2011

Хм, это будет сложно.Я хотел бы создать UserControl с сеткой, а затем поместить один UserControl в Window1, а другой в Window2.Но чтобы синхронизировать состояние Window1-Grid и Window2-Grid, вам придется привязать их к одному и тому же объекту.

Редактировать: Вот, подготовил для вас пример

Шаг 1: Поместите Grid в UserControl, чтобы его можно было повторно использовать.

Обратите внимание, что для свойства UpdateSourceTrigger в привязке установлено PropertyChangedэто обновляет исходный объект, когда пользователь печатает, поэтому мы увидим изменения в Window2, поскольку они происходят в Window1.

CommonGrid.xaml

<UserControl x:Class="WindowSync.CommonGrid"
             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">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto"  />
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0" Orientation="Horizontal" Margin="5">
            <TextBlock Text="Name: " />
            <TextBox Width="200" Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
        </StackPanel>
        <StackPanel Grid.Row="1" Orientation="Horizontal" Margin="5">
            <CheckBox IsChecked="{Binding IsAdmin, UpdateSourceTrigger=PropertyChanged}" />
            <TextBlock Text=" Is Admin" />
        </StackPanel>
    </Grid>
</UserControl>

Шаг 2: Поместите UserControl в нужные окна.

Примечание: вы должны ссылаться на пространство имен, в котором находится UserControl, в этом случае пространство именWindowSync, эта строка позволяет нам использовать пространство имен xmlns:app="clr-namespace:WindowSync".

Window1.xaml

<Window x:Class="WindowSync.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:app="clr-namespace:WindowSync"
        Title="Window 1" Height="200" Width="400">
    <app:CommonGrid x:Name="Window1Grid" />
</Window>

Windo1.xaml.cs

    public Window1()
    {
        InitializeComponent();
        Window1Grid.DataContext = Person.User; // bind the UserControl in Window1 to the an object
        new Window2().Show(); // create an instance of window 2 and show it
    }

Window2.xaml

<Window x:Class="WindowSync.Window2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:app="clr-namespace:WindowSync"
        Title="Window 2" Height="200" Width="400">
    <app:CommonGrid x:Name="Window2Grid" />
</Window>

Window2.xaml.cs

    public Window2()
    {
        InitializeComponent();
        Window2Grid.DataContext = Person.User; // bind the UserControl in Window2 to the same object
    }

Person.cs

Я только что создал случайный объект с именем persдля демонстрации.

Примечание: вам нужно реализовать интерфейс INotifyPropertyChanged на вашем объекте и вызывать соответствующее событие PropertyChanged всякий раз, когда что-то изменяется, это то, что позволяет нам синхронизировать две сетки.Window1 что-то меняет, событие PropertyChanged запускается, Window2 поднимает его и вносит изменения.

public class Person : INotifyPropertyChanged
{
    public static Person User = new Person();

    #region Name
    private string _Name;
    public string Name
    {
        get { return _Name; }
        set
        {
            _Name = value;
            OnPropertyChanged("Name");
        }
    }
    #endregion

    #region IsAdmin
    private bool _IsAdmin;
    public bool IsAdmin
    {
        get { return _IsAdmin; }
        set
        {
            _IsAdmin = value;
            OnPropertyChanged("IsAdmin");
        }
    }
    #endregion

    #region INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(property));
    }
    #endregion
}

В любом случае, я надеюсь, это поможет вам.Я загрузил заархивированную версию проекта, если вы застряли.http://www.mediafire.com/?yv84xbben6tjdy7

Удачи.

...