WPF UserControl.Loaded 事件不触发

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21858464/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 10:54:42  来源:igfitidea点击:

WPF UserControl.Loaded event does not trigger

c#wpfmvvmloaded

提问by Kjell Derous

In my program, when I hover over (MouseEnter event) a certain UserControl (here I use TransportOrderLineUserControl) a TransportOrderLineDetailView should be shown.

在我的程序中,当我将鼠标悬停在(MouseEnter 事件)某个 UserControl(这里我使用 TransportOrderLineUserControl)上时,应该显示一个 TransportOrderLineDetailView。

The TransportOrderLineDetailView should be placed at the bottom right of my screen. For this I need to know the ActualWidth & ActualHeight for a correct placement. Because those 2 properties need to have a value different than 0 I execute this code with the DetailView.Loaded event.

TransportOrderLineDetailView 应该放在我的屏幕的右下角。为此,我需要知道 ActualWidth 和 ActualHeight 才能正确放置。因为这 2 个属性需要具有不同于 0 的值,所以我使用 DetailView.Loaded 事件执行此代码。

I use the exact same way for two other objects. There it works but not for the TransportOrderLineDetailView.

我对另外两个对象使用完全相同的方式。它在那里工作,但不适用于 TransportOrderLineDetailView。

Code where the view is generated:

生成视图的代码:

TransportOrderLineDetailView tolDetailView = new TransportOrderLineDetailView(new TransportOrderLineDetailViewModel(transportOrderLine)); 
window.DetailContent = tolView; 
tolView.Loaded += SetDetailViewOnUI;

Code-behind view:

代码隐藏视图:

public TransportOrderLineDetailView(TransportOrderLineDetailViewModel detailViewModel)
    {
        InitializeComponent();
        DataContext = detailViewModel;
    }

Method SetDetailViewOnUI:

方法 SetDetailViewOnUI:

 private void SetDetailPanelOnUI(object sender, EventArgs e)
    {
        Canvas.SetLeft(window.DetailContentPresenter,
                                   window.grid_Root.ActualWidth - window.DetailContentPresenter.ActualWidth);
        Canvas.SetTop(window.DetailContentPresenter,
                      window.grid_Root.ActualHeight - window.DetailContentPresenter.ActualHeight);
    }

Example where it works well:

运行良好的示例:

DriverDetailView driverDetailView = new DriverDetailView(new DriverDetailViewModel(driver));
window.DetailContent = driverDetailView;
driverDetailView.Loaded += SetDetailPanelOnUI;

More information

更多信息

  • window.DetailContent:

    private UserControl detailContent;
    
    public UserControl DetailContent
    {
        get { return this.detailContent; }
        set
        {
            this.detailContent = value;
            OnPropertyChanged("DetailContent");
        }
    }
    
  • DetailContentPresenter:

     <Canvas Grid.RowSpan="2" x:Name="canvas_Popup_DetailView">
         <ContentPresenter Content="{Binding DetailContent}" x:Name="detailContentPresenter"/>
     </Canvas>
    
  • window.DetailContent:

    private UserControl detailContent;
    
    public UserControl DetailContent
    {
        get { return this.detailContent; }
        set
        {
            this.detailContent = value;
            OnPropertyChanged("DetailContent");
        }
    }
    
  • DetailContentPresenter:

     <Canvas Grid.RowSpan="2" x:Name="canvas_Popup_DetailView">
         <ContentPresenter Content="{Binding DetailContent}" x:Name="detailContentPresenter"/>
     </Canvas>
    

A test where the loaded event also is not triggered:

加载事件也未触发的测试:

 public TransportOrderLineDetailView(TransportOrderLineDetailViewModel detailViewModel)
    {
        InitializeComponent();

        DataContext = detailViewModel;
        this.Loaded += test; //Test here
    }

    private void test(object sender, System.Windows.RoutedEventArgs e)
    {
// method never executed
    }

采纳答案by Kjell Derous

Found the solution. There was an error which was not thrown.

找到了解决办法。有一个没有抛出的错误。

How I did find it was going in Visual Studio to Debug -> Exceptions -> Tick the possible exceptions.

我是如何发现它在 Visual Studio 中进行调试 -> 异常 -> 勾选可能的异常。

Hope this will help other people having trouble with the same stuff. :)

希望这会帮助其他人遇到同样的问题。:)