Доступ к элементам usercontrol'a из другого окна wpf

WPF
  1. 5 года назад

    Здравствуйте.
    Есть главное окно программы MainWindow.xaml

    <mui:ModernWindow x:Class="AccessUserControl.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:mui="http://firstfloorsoftware.com/ModernUI"
            Title="mui" IsTitleVisible="True"          
            ContentSource="/Pages/Page1.xaml" Width="600" Height="400">
    
        <mui:ModernWindow.MenuLinkGroups>
            <mui:LinkGroup DisplayName="Первая вкладка">
                <mui:LinkGroup.Links>
                    <mui:Link Source="/Pages/Page1.xaml" />
                </mui:LinkGroup.Links>
            </mui:LinkGroup>
            <mui:LinkGroup DisplayName="Вторая вкладка" GroupName="settings">
                <mui:LinkGroup.Links>
                    <mui:Link Source="/Pages/Page2.xaml" />
                </mui:LinkGroup.Links>
            </mui:LinkGroup>
        </mui:ModernWindow.MenuLinkGroups>
    </mui:ModernWindow>

    В нем отображается usercontrol Page1.xaml

    <UserControl x:Class="AccessUserControl.Pages.Page1"
                 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" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:mui="http://firstfloorsoftware.com/ModernUI"
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
        <Grid Style="{StaticResource ContentRoot}">
                <Grid>
                <Button x:Name="OpenChildrenWindow" Content="Открыть дочерние окно" HorizontalAlignment="Left" Margin="62,183,0,0" VerticalAlignment="Top" Width="151" Click="OpenChildrenWindow_Click"/>
                <TextBox x:Name="txtbox1" HorizontalAlignment="Left" Height="23" Margin="77,27,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
                <TextBox x:Name="txtbox2" HorizontalAlignment="Left" Height="23" Margin="77,82,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
            </Grid>
        </Grid>
    </UserControl>

    Из этой страницы открывается новое окно ChildrenWindow.xaml

    <controls:MetroWindow x:Name="ChildrenWindow1" x:Class="AccessUserControl.ChildrenWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
        Title="MainWindow" 
        Height="350" 
        Width="525">
        <Grid>
            <TextBox x:Name="ChildTxtBox1" HorizontalAlignment="Left" Height="23" Margin="209,63,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
            <TextBox x:Name="childTxtBox2" HorizontalAlignment="Left" Height="23" Margin="209,118,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" SpellCheck.IsEnabled="True"/>
            <Button x:Name="AcceptChanges" Content="Применить изменения" HorizontalAlignment="Left" Margin="194,178,0,0" VerticalAlignment="Top" Width="146" RenderTransformOrigin="0.12,0.693" Click="AcceptChanges_Click"/>
    
        </Grid>
    </controls:MetroWindow>

    Как из ChildrenWindow.xaml получить доступ к элементам (textbox'ам к примеру) Page1.xaml?

  2. Alexandr_Erohin

    Jul 4 Администратор
    Добавлено 5 года назад Alexandr_Erohin

    В дочернем окне нужно определить общедоступные свойства для элементов управления родительского окна (или UserControl'a как в этом примере), например:

    public TextBox Page1_txtbox1 { get; set; }
    public TextBox Page1_txtbox2 { get; set; }

    В коде родительского окна при создании экземпляра дочерного окна (как я понял из приведенного кода это происходит в обработчике OpenChildrenWindow_Click) передать через эти свойства ссылки на нужные элементы управления:

    private void OpenChildrenWindow_Click(object sender, RoutedEventArgs e)
    {
                MetroWindow newWindow = new MetroWindow();
    
                newWindow.Page1_txtbox1 = this.txtbox1;
                newWindow.Page1_txtbox2 = this.txtbox2;
    
                newWindow.Show();
    }

    После этого элементы родительского окна будут доступны дочернему окну через соответствующие свойства Page1_txtbox1 и Page1_txtbox2

или зарегистрируйтесь чтобы ответить