私のプログラムでは、(MouseEnter イベント) 特定の UserControl (ここでは TransportOrderLineUserControl を使用) にカーソルを合わせると、TransportOrderLineDetailView が表示されます。
TransportOrderLineDetailView は画面の右下に配置する必要があります。このためには、正しい配置のために ActualWidth と ActualHeight を知る必要があります。これら 2 つのプロパティは 0 以外の値を持つ必要があるため、このコードを DetailView.Loaded イベントで実行します。
他の 2 つのオブジェクトについてもまったく同じ方法を使用します。そこでは機能しますが、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"); } }
詳細コンテンツ プレゼンター:
<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
}