2013-01-15 51 views
0

我似乎無法找到一種方法來檢測面板何時完成加載。我將一些功能添加到已有的WPF/Prism項目中。當頁面完成渲染時,我需要回調。在代碼檢測棱鏡上的面板負載

<UserControl x:.... 

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
...> 

<i:Interaction.Triggers> 
     <i:EventTrigger EventName="Loaded"> 
      <i:InvokeCommandAction Command="{Binding DoSomething}" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 

然後隱藏文件:在我需要得到回調頁面加載時的XAML的頂部

在用戶控件:我想這

public void DoSomething(object sender, EventArgs e) 
{ 
    System.Diagnostics.Debug.WriteLine("received callback"); 
} 

目前它不工作,我不確定這是否是正確的路徑,因爲我是WPF,棱鏡和.NET的新手。

回答

0

好吧,我看到你已經知道了答案......無論如何...... 你做錯了,你已經在XAML中將命令綁定到了命令中,而你沒有命令:)基本上你搞砸了標準的「代碼 - 背後的方法「,讓我們說」MVVM方法「/綁定。

所以,當你觸動了代碼隱藏並創建DoSomethingEventHandler那裏你可以簡單地

<UserControl .. Loaded="UserControl_Loaded"> 
    .. 
    </UserControl> 

與代碼隱藏:

private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e) 
    { 
     // Do Something 
    } 

這將是罰款...但它不是MVVM :]

那麼和你的新方法(沒有代碼隱藏/讓我們說MVVM)...

如果使用棱鏡V4.1,你可以看看here這項功能大多數人在棱鏡:)錯過,但有提到的解決方案:)

以及你知道你需要ICommand你結合......它確實不一定是DelegateCommand你可以使用你想要的...(我更喜歡和使用RelayCommand

那麼但是我們從上述鏈接中學到了什麼?

  1. 有時......不是這個時候...... ICommand可以改變控制啓用狀態,當你不使用Prism's Interactivity它不更新,您只需使用Blend SDK's Interactivity ...你不需要這一次。 .. 我承認...但也許有一天:)
  2. 而且你也不需要處理那些無聊的參數,因爲你沒有得到他們無論如何:d(當你需要的參數數量可以使用MVVM光例如)

所以你能做的最好的是這樣的:

<UserControl 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
    xmlns:prism="clr-namespace:Microsoft.Practices.Prism.Interactivity;assembly=Microsoft.Practices.Prism.Interactivity" 
...  
> 
... 
<i:Interaction.Triggers> 
    <i:EventTrigger EventName="Loaded"> 
     <prism:InvokeCommandAction Command="{Binding MyCommand}" /> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

和您的視圖模型,例如:

public ICommand MyCommand 
    { 
     get 
     { 
      return new RelayCommand(this.MyCommandExecute); 
     } 
    } 

    private void MyCommandExecute() 
    { 
     // DO Something... 
    } 

對不起,我unswered已經回答的問題,但我想我可能添加一些有趣的信息:)

+0

感謝您的答案!我總是喜歡閱讀解決方案! – Crystal

0

哦,我想我只是想通了。發現這個帖子:Binding the Loaded event?

我需要創建一個新的DelegateCommand

public DelegateCommand DoSomething {get; set; } 

然後將其綁定到一個回調:

DoSomething = new DelegateCommand(DoSomethingCommandHandler); 

然後在我的

private void DoSomethingCommandHandler 
{ 
    // callback received 
} 

似乎工作。讓我知道如果有更好的東西。就像我說的,我完全是小白菜。