Как я могу запустить событие в window и обработать его в UserControl? C # WPF

#wpf

#wpf

Вопрос:

Я использую свой usercontrol в window. Я хочу что-то сделать в usercontrol при срабатывании события Window с изменением состояния.

Я хочу отправить событие statechanged в usercontrol.

Как я могу это сделать?

Комментарии:

1. Объявите свойство в вашем UserControl и установите его при изменении состояния окна.

2. Вы хотите привязать событие StateChanged к методу. Можете ли вы показать нам, что вы пробовали, а также используете ли вы шаблон MVVM?

3. вы можете принять ответ в качестве решения, если он сработал для вас

Ответ №1:

Вариант 1:

  • Определите общедоступный метод в UserControl коде, который может быть вызван для уведомления о возникновении события
  • Обработайте StateChanged событие в Window исходном коде и вызовите определенный метод в UserControl

Вариант 2:

  • Внедрите интерфейс для StateChanged события и внедрите этот интерфейс в свой Window
  • Реализовать DependencyProperty с интерфейсом в качестве типа в UserControl
  • Привяжите свойство к вашему Window при создании экземпляра UserControl
  • Зарегистрируйтесь в StateChanged событии на свойстве, измененном в коде, лежащем в основе UserControl

Немного кода для демонстрации того, как реализовать и использовать вариант 2:

 public interface IStateChanged
{
    event EventHandler StateChanged;
}

public partial class MainWindow : Window, IStateChanged
{
    public MainWindow()
    {
        InitializeComponent();
    }
}

public partial class MyUserControl : UserControl
{
    public MyUserControl()
    {
        InitializeComponent();
    }


    public IStateChanged StateChangedHost
    {
        get { return (IStateChanged)GetValue(StateChangedHostProperty); }
        set { SetValue(StateChangedHostProperty, value); }
    }

    // Using a DependencyProperty as the backing store for StateChangedHost.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty StateChangedHostProperty =
        DependencyProperty.Register("StateChangedHost", typeof(IStateChanged), typeof(MyUserControl), new FrameworkPropertyMetadata(null, StateChangedHost_PropertyChanged));

    private static void StateChangedHost_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var self = d as MyUserControl;
        if (e.OldValue != null)
        {
            ((IStateChanged)e.OldValue).StateChanged -= self.NotifyStateChanged;
        }
        if (e.NewValue != null)
        {
            ((IStateChanged)e.NewValue).StateChanged  = self.NotifyStateChanged;
        }
    }

    private void NotifyStateChanged(object sender, EventArgs e)
    {
        // implementation logic on StateChanged event
    }
}

<Window [...]>
    <Grid>
        <local:MyUserControl StateChangedHost="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MainWindow}}}"/>
    </Grid>
</Window>
  

Ответ №2:

Добавьте метод в пользовательский элемент управления для уведомления об этом

 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void MainWindow_StateChanged(object sender, EventArgs e)
    {
        myUserControl.StateChanged();
    }

}

public partial class MyUserControl : UserControl
{
    public MyUserControl()
    {
        InitializeComponent();
    }
    public StateChanged()
    {
        ...
    }

}

<Window [...]>
    <Grid>
        <local:MyUserControl x:Name="myUserControl"/>
    </Grid>
</Window>
  

Комментарии:

1. Признаюсь, мне было лень писать код для этого варианта моего ответа 🙂

2. да, но это самое простое решение, если вы хотите что-то быстрое и «работающее»

Ответ №3:

Это должно сработать

 public partial class MyUserControl : UserControl
{
    public MyUserControl ()
    {
        InitializeComponent();
        DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(Window.WindowStateProperty, typeof(Window));
        dpd.AddValueChanged(Application.Current.MainWindow, (s, e) =>
        {
            //your code
        });
    }
}
  

По сути, он сообщает пользовательскому элементу управления соблюдать WindowsStateProperty, и при каждом изменении этого состояния он будет запускаться

Ответ №4:

Я думаю, что это неправильный подход.

мой код будет выглядеть следующим образом:

 public class MyUserControl : UserControl{

  event EventHandler ParentWindowStateChanged;

  public void RaiseParentWindowStateChanged(Window sender){
       this.ParentWindowStateChanged?.Invoke(sender, EventArgs.Empty);
  }
}
  

в окне.StateChanged вы можете вызвать MyUserControl. Вызовите parentwindowstatechanged(this).

в конструкторе UserControl вы можете добавить обработчик для события ParentWindowStateChanged, например

 MyUserControl(){
    this. ParentWindowStateChanged  = (sender, args) => {
        // do something
    };
  

С уважением

Steffen