2011-05-11 51 views
3

我正在使用Caliburn Micro開發一個簡單的MVVM WPF應用程序。WPF按鈕樣式取決於活動視圖

我ShellView有一個ContentControl中和每個綁定到我的ShellViewModel的公共方法三個按鍵,可以說ActivateView1,ActivateView2和ActivateView3。

我ShellViewModel從導體繼承和每個激活方法調用ActivateItem(new View1ViewModel())

到目前爲止好。當我點擊一個按鈕時,一個新的視圖在ContentControl中被激活。問題是我需要每個按鈕來改變樣式,當其「關聯的視圖」是活躍的,我真的不知道如何實現這個功能。你有什麼建議嗎?

我對Caliburn Micro和WPF樣式相當陌生,所以任何幫助都將不勝感激。

回答

1

我不是很肯定這一點,但我依然能想到這樣的事情,

您可以創建一個風格和樣式添加到您的按鈕。像這樣的東西

<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"> 
      <Style.Triggers> 
       <Trigger Property="IsPressed" Value="True"> 
         <Setter Property="Fill" TargetName="yourButtonName" Value="Black"/> 
         <Setter Property="Margin" TargetName="yourButtonName" Value="5,0,5,0"/> 
       </Trigger> 
      </Style.Triggers> 
</Style> 

,你可以添加這種風格到你的按鈕。

+0

這不會工作。當我按下另一個按鈕並啓動anoter視圖時,該風格不應再被激活:) – Vern 2011-05-11 21:01:35

+0

您可以添加另一個觸發器操作並更新設置值 – nipiv 2011-05-11 21:13:16

+0

不會讓它停留活動 - 僅在按下按鈕時。它必須與內容控件中顯示的當前視圖「同步」。我正在考慮在ViewModel中創建三個布爾屬性,並在發生視圖更改時更新它們。你對此有何看法? – Vern 2011-05-12 06:40:22

0

我能想到的兩個可能的選項,你可以使用:

你可以你的按鈕樣式屬性綁定到你ShellViewModel屬性。在這些屬性可以判斷風格基礎上,彈活動視圖返回即

return ActiveItem == button1ViewModel ? 
        (Style) App.Current.Resources["Button1ActiveStyleKey"] : 
        (Style) App.Current.Resources["Button1InactiveStyleKey"]; 

這將意味着你的視圖模型就知道哪些你可能不希望樣式的。如果是這樣的情況下,方案二是寫一個Caliburn.Micro IResult這改變了按鈕的樣式和從通過按鈕調用的協程(爲每個按鈕一個)返回那些3單擊即

public IEnumerable<IResult> ButtonOneClicked() 
{ 
    yield return new ChangeButtonStyle("Button1Name", "Button1ActiveStyleKey"); 
    yield return new ChangeButtonStyle("Button2Name", "Button2InactiveStyleKey"); 
    yield return new ChangeButtonStyle("Button3Name", "Button3InactiveStyleKey"); 
} 

執行ChangeButtonStyle IResult會搜索視圖(通過參數ActionExecutionContext提供參數IResult.Execute)以獲取名稱提供給ChangeButtonStyle ctor的第一個參數的控件,然後使用提供的資源密鑰設置該控件的style屬性第二個參數爲ChangeButtonStyle ctor。

0

您可以使用

<Trigger Property ="IsPressed" Value ="True"> 

我認爲它的伎倆......