簡體   English   中英

為多個VisualStateGroups實現VisualStates的正確方法是什么?

[英]What is the proper way to implement VisualStates for multiple VisualStateGroups?

這個問題是我之前的問題以及有關VisualStates在WPF中如何工作的相關問題的后續。

目前,我的理解是在不同的VisualStateGroups設置相同屬性的動畫可能會導致問題(請參閱鏈接的問題)。

為了解決這些問題,需要利用漏洞。 (也許漏洞不是正確的術語,但看來解決方案不是WPF設計人員想要的。)

我想知道在多個VisualStateGroups設置同一個屬性的動畫而不引起不良副作用的正確方法是什么。 如果不可能,那么為控件實現相同視覺行為的正確途徑是什么?

我可以在MSDN上找到一些相關文檔:

每個組的控件始終處於完全一種狀態。 例如,即使鼠標指針不在按鈕上,按鈕也可以具有焦點,因此處於焦點狀態的按鈕可以處於MouseOver,Pressed或Normal狀態。

這引出我第二個問題...

如何提供僅當兩個特定的VisualStates處於活動狀態時才會發生的視覺行為?

ToggleButton為例:

  • 如果該按鈕被選中 ,我想顯示行為1
  • 如果該按鈕為“ 禁用” ,則我要顯示“ 行為2”
  • 最后,如果該按鈕為Checked and Disabled ,那么我想顯示Behavior 3

在上面的示例中,您將如何呈現第三種視覺行為?

對於問題的第一部分,例如,您希望每個狀態與每個對象與不同的單獨對象進行交互,而不是與每個VisualState相同。

    <VisualState x:Name="Disabled">
      <Storyboard>
          <ObjectAnimationUsingKeyFrames Storyboard.TargetName="DisabledState" 
                                  Storyboard.TargetProperty="(UIElement.Visibility)">
            <DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
          </ObjectAnimationUsingKeyFrames>
       </Storyboard>
    </VisualState>
    <VisualState x:Name="Checked">
      <Storyboard>
          <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CheckedState" 
                                  Storyboard.TargetProperty="(UIElement.Visibility)">
            <DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
          </ObjectAnimationUsingKeyFrames>
       </Storyboard>
    </VisualState>

<!-- Each state interacts with its own object in your ControlTemplate ideally -->
<Border x:Name="CheckedState" Visibility="Collapsed"
        Background="Green"/>
<Border x:Name="DisabledState" Visibility="Collapsed"
        Background="White" Opacity=".5"/>

而不是共享一個對象的屬性更改,例如;

<VisualState x:Name="Disabled">
  <Storyboard>
      <ColorAnimation d:IsOptimized="True"
                      Duration="0"
                      Storyboard.TargetName="Background"
                      Storyboard.TargetProperty="(SolidColorBrush.Color)"
                      To="White" />
   </Storyboard>
</VisualState>
<VisualState x:Name="Checked">
  <Storyboard>
      <ColorAnimation d:IsOptimized="True"
                      Duration="0"
                      Storyboard.TargetName="Background"
                      Storyboard.TargetProperty="(SolidColorBrush.Color)"
                      To="Green" />
   </Storyboard>
</VisualState>

<Border x:Name="Background" Background="Blue"/>

根據您的第二個問題, VisualState將充當布爾,因為它處於或不處於該狀態。 要共享狀態聲明,您必須在某個地方或某個地方使用MultiTrigger或轉換器來增加一些技巧。

希望這可以幫助。 干杯

編輯添加:

因此,您還可以使用VisualTransition來使用;

 <VisualStateManager.VisualStateGroups>
  <VisualStateGroup x:Name="CommonStates">
    <VisualStateGroup.Transitions>
      <VisualTransition From="Normal"
        GeneratedDuration="0:0:0.2"
        To="Checked">
        <VisualTransition.GeneratedEasingFunction>
          <ExponentialEase EasingMode="EaseIn" Exponent="7" />
        </VisualTransition.GeneratedEasingFunction>
      </VisualTransition>
      <VisualTransition From="Checked"
        GeneratedDuration="0:0:0.2"
        To="Normal">
        <VisualTransition.GeneratedEasingFunction>
          <CircleEase EasingMode="EaseIn" />
        </VisualTransition.GeneratedEasingFunction>
      </VisualTransition>
    </VisualStateGroup.Transitions>
    <VisualState x:Name="Normal" />
    <!-- etc, etc, etc -->

這樣您就可以玩不同的游戲,產生的持續時間等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM