在我的程序中,當我將鼠標懸停在(MouseEnter事件)某個UserControl(此處使用TransportOrderLineUserControl)時,應顯示一個TransportOrderLineDetailView。WPF UserControl.Loaded事件不會觸發
TransportOrderLineDetailView應該放在我的屏幕的右下角。爲此,我需要知道ActualWidth & ActualHeight以獲得正確的位置。因爲這兩個屬性需要具有不同於0的值,所以我使用DetailView.Loaded事件執行此代碼。
我對兩個其他對象使用完全相同的方式。它有效,但不適用於TransportOrderLineDetailView。在產生圖
代碼:
TransportOrderLineDetailView tolDetailView = new TransportOrderLineDetailView(new TransportOrderLineDetailViewModel(transportOrderLine));
window.DetailContent = tolView;
tolView.Loaded += SetDetailViewOnUI;
代碼隱藏視圖:
public TransportOrderLineDetailView(TransportOrderLineDetailViewModel detailViewModel)
{
InitializeComponent();
DataContext = detailViewModel;
}
方法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);
}
實施例,其中它工作得很好:
DriverDetailView driverDetailView = new DriverDetailView(new DriverDetailViewModel(driver));
window.DetailContent = driverDetailView;
driverDetailView.Loaded += SetDetailPanelOnUI;
更多信息
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>
甲測試,其中加載的事件還沒有被觸發:
public TransportOrderLineDetailView(TransportOrderLineDetailViewModel detailViewModel)
{
InitializeComponent();
DataContext = detailViewModel;
this.Loaded += test; //Test here
}
private void test(object sender, System.Windows.RoutedEventArgs e)
{
// method never executed
}
我已經做了一些研究,他們說這是因爲InitializeComponent();不寫。但正如你所看到的,這是在我的代碼中實現的。 –
我不確定,但我猜測,當Loaded事件被觸發時,UI尚未被測量/排列......? – Steve