#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