2017-07-01 82 views
1

我有一個按鈕,其狀態根據某些標準而變化,例如,當切換按鈕打開時,更改顏色,大小,啓用/禁用。我的目標是封裝狀態,使得我們可以做這樣的事情:(?也許在XAML)如何爲UWP元素設置狀態?

if (toggleButton.IsOn) btnName.state = State1; 
else btnName.state = State2; 

我們定義狀態1和狀態2。

這可能與UWP有關嗎?

+0

_「這可能與UWP有關嗎?」_ - 當然。基於XAML的API都希望您使用MVVM風格的編程來分離您的業務邏輯和UI。根據「state」的實際情況,您需要在按鈕樣式中使用觸發器,或者根據切換按鈕狀態調整視圖模型中的屬性。鑑於你的問題含糊不清,它實際上回答太寬泛了。你需要準確地展示你在做什麼,你嘗試過什麼,以及你遇到什麼問題,使用[mcve]和清晰詳細的解釋。 –

回答

2

您可以使用VisualStateManager調用某個控件的某個狀態。例如,如果你想手動讓ToggleSwitch去其On狀態,你可以寫 -

VisualStateManager.GoToState(MyToggleSwitch, "On", true); 

但不這樣做。因爲這隻能設定狀態目視,底層IsOn屬性仍然是False

實際上,通過將IsOn設置爲True,將自動應用On狀態。這是因爲在ToggleSwitchdefault style,有一個On狀態就像下面一堆Storyboard S中ToggleStates視覺狀態組內 -

<VisualState x:Name="On"> 
    <Storyboard> 
    <DoubleAnimation Storyboard.TargetName="KnobTranslateTransform" 
        Storyboard.TargetProperty="X" 
        To="24" 
        Duration="0" /> 
    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="SwitchKnobBounds" 
            Storyboard.TargetProperty="Opacity"> 
     <DiscreteObjectKeyFrame KeyTime="0" Value="1" /> 
    </ObjectAnimationUsingKeyFrames> 
    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="OuterBorder" 
            Storyboard.TargetProperty="Opacity"> 
     <DiscreteObjectKeyFrame KeyTime="0" Value="0" /> 
    </ObjectAnimationUsingKeyFrames> 
    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="SwitchKnobOn" 
            Storyboard.TargetProperty="Opacity"> 
     <DiscreteObjectKeyFrame KeyTime="0" Value="1" /> 
    </ObjectAnimationUsingKeyFrames> 
    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="SwitchKnobOff" 
            Storyboard.TargetProperty="Opacity"> 
     <DiscreteObjectKeyFrame KeyTime="0" Value="0" /> 
    </ObjectAnimationUsingKeyFrames> 
    </Storyboard> 
</VisualState> 

每當IsOn設置爲True這些Storyboard旨意開始。這個觸發邏輯被封裝在ToggleSwitch的代碼中。所以當你想爲自定義控件定義你自己的視覺狀態時,你需要手動將狀態屬性(例如IsChecked,IsSelected,IsOn,IsEnabled)與它們的相應狀態掛鉤,所以當其他人使用你的控件時,它們可以簡單地更新它們並期望適用正確的狀態。