none
Есть две xaml страницы надо что бы из одной xaml страницы управлять элементами управления другой xaml страницы как это сделать?

    Вопрос

  • Есть две xaml страницы надо что бы из одной xaml страницы управлять элементами управления другой xaml страницы как это сделать?
    13 ноября 2014 г. 17:19

Ответы

  • Добрый день.

    Небольшой пример.

    1. В WPF приложение добавляю еще одну форму со следующими разметкой и кодом:

    <Window x:Class="WpfApplication6.SecondWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="SecondWindow" SizeToContent="WidthAndHeight">
        <StackPanel Orientation="Horizontal">
            <TextBox x:Name="tbInput" Width="150" Margin="5" />
            <Button Content="Отправить" Margin="5" Click="Button_Click" />
        </StackPanel>
    </Window>


    public partial class SecondWindow : Window
    {
        public SecondWindow()
        {
            InitializeComponent();
        }
    
        public event Action<string> TextEntered;
    
        protected void OnTextEntered(string p_text)
        {
            var handler = TextEntered;
            if (handler != null)
            {
                handler(p_text);
            }
        }
    
        public void ConfirmNumber(bool p_isConfirm)
        {
            if (p_isConfirm)
            {
                tbInput.Foreground = new SolidColorBrush(Colors.Green);
            }
            else
            {
                tbInput.Foreground = new SolidColorBrush(Colors.Red);
            }
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            OnTextEntered(tbInput.Text);
        }
    }

    2. В код главной формы вношу изменения:

    public partial class MainWindow : Window
    {
        private SecondWindow _second;
    
        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded;
        }
    
        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            _second = new SecondWindow();
            _second.TextEntered += CheckText;
            _second.Show();
        }
    
        private void CheckText(string p_text)
        {
            int x;
            var result = false;
            if (int.TryParse(p_text, out x))
            {
                result = true;
            }
            _second.ConfirmNumber(result);
        }
    }

    3. Запускаю:

    Все, главная форма может влиять на дочернюю, а дочерняя передавать по своей
    инициативе данные главной для обработки.

    P.s. По шагам и с дополнительными комментариями можно посмотреть здесь.


    14 ноября 2014 г. 7:20
    Отвечающий

Все ответы

  • Добрый день.

    Небольшой пример.

    1. В WPF приложение добавляю еще одну форму со следующими разметкой и кодом:

    <Window x:Class="WpfApplication6.SecondWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="SecondWindow" SizeToContent="WidthAndHeight">
        <StackPanel Orientation="Horizontal">
            <TextBox x:Name="tbInput" Width="150" Margin="5" />
            <Button Content="Отправить" Margin="5" Click="Button_Click" />
        </StackPanel>
    </Window>


    public partial class SecondWindow : Window
    {
        public SecondWindow()
        {
            InitializeComponent();
        }
    
        public event Action<string> TextEntered;
    
        protected void OnTextEntered(string p_text)
        {
            var handler = TextEntered;
            if (handler != null)
            {
                handler(p_text);
            }
        }
    
        public void ConfirmNumber(bool p_isConfirm)
        {
            if (p_isConfirm)
            {
                tbInput.Foreground = new SolidColorBrush(Colors.Green);
            }
            else
            {
                tbInput.Foreground = new SolidColorBrush(Colors.Red);
            }
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            OnTextEntered(tbInput.Text);
        }
    }

    2. В код главной формы вношу изменения:

    public partial class MainWindow : Window
    {
        private SecondWindow _second;
    
        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded;
        }
    
        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            _second = new SecondWindow();
            _second.TextEntered += CheckText;
            _second.Show();
        }
    
        private void CheckText(string p_text)
        {
            int x;
            var result = false;
            if (int.TryParse(p_text, out x))
            {
                result = true;
            }
            _second.ConfirmNumber(result);
        }
    }

    3. Запускаю:

    Все, главная форма может влиять на дочернюю, а дочерняя передавать по своей
    инициативе данные главной для обработки.

    P.s. По шагам и с дополнительными комментариями можно посмотреть здесь.


    14 ноября 2014 г. 7:20
    Отвечающий
  • Спасибо большое =)