2011-06-01 87 views
0

所以,大家好。Silverlight和WPF:ControlTemplate中的VisualStateManager不起作用

我做了兩個測試程序來創建自己的控件。一個在Silverlight中,一個在WPF中。我創造了一種RangeSlider。這個滑塊當然有兩個方向,水平和垂直。我首先使用了兩種不同的技術來創建我的RangeSlider。在WPF中,我使用了Silverlight中的觸發器(你知道那裏沒有觸發器),我改變了CodeBehind中水平和垂直模板的可見性。

現在: 我想爲Silverlight和WPF都使用一種技術。因此我使用VisualStateManager。

我有一個模板定義兩個滑塊(一個用於左值,另一個用於右值)。簡化它看起來像的重要價值:

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup> 
    <VisualState x:Name="Vertical"> 
     <Storyboard> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_HorizontalTemplate" 
             Storyboard.TargetProperty="Visibility"> 
      <DiscreteObjectKeyFrame Value="{x:Static Visibility.Collapsed}" KeyTime="0"/> 
     </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
    </VisualState> 
    <VisualState x:Name="Horizontal" /> 
    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

這仍然運行:

... 
<ControlTemplate> 
    <Grid x:Name="PART_Content"> 
    <!-- VSM: See following code sequence --> 
    <Grid x:Name="PART_HorizontalTemplate"> 
     <Slider x:Name="PART_HorizontalSliderLeft" 
       Template="{StaticResource HorizontalSliderTemplate}" 
       Orientation="{TemplateBinding Orientation}" /> 
     ... 
    </Grid> 
    <Grid x:Name="PART_VerticalTemplate"> 
     ... 
    </Grid> 
    </Grid> 
</ControlTemplate> 

此外,還有的VSM垂直與水平的外觀之間切換。

正如你在代碼序列看,視覺滑塊是由模板定義,這裏Horizo​​ntalSliderTemplate(我再次減少代碼):

<ControlTemplate x:Key="HorizontalSliderTemplate" TargetType="{x:Type Slider}"> 
    <Border x:Name="Border" ...> 
    <!-- VSM here. Like above. --> 
    <Grid x:Name="Grid"> 
     <Rectangle x:Name="PART_SelectionRange"/> 
     <Track x:Name="PART_Track"> 
     ... 
     </Track> 
    </Grid> 
    </Border> 
</ControlTemplate> 

其實也有一個VerticalSliderTemplate。 但我想將兩個ControlTemplate結合到一個模板中並使用VSM。這裏我們來看看我的問題:

我沒有在'內部'ControlTemplate中運行VSM。它與運行的VSM-Part幾乎相同,只是TargetName被更改。我不知道如何調試GoToState上正在運行的內容,但我相信模板中的VSM永遠不會被發現,並且永遠不會執行。

我可以想象,只有一點細節缺失,但我不能看到樹木的木材。也許有一件重要的事情我不知道關於模板或VSM,而我不在賽道上。 或者我必須從外部觸發「內部」VSM,還是有可能從「VSM外部」訪問元素? 或者「內部」模板中的VSM沒有訪問權限嗎?

我希望我能夠很好地解釋我的問題,並且有人知道解決方案或者我可以找到的關鍵字。只需在谷歌輸入關鍵字VSM,ControlTemplate,Storyboard等,不會有任何幫助。

在此先感謝。

回答

0

所以,我得到了一個解決方案。 在我要添加到要切換DataTrigger的元素的'inner'模板中。此DataTrigger綁定到PART_Horizo​​ntalTemplate可見性,幷包含一個可以執行我需要的操作的Storyboard。

也許這不是我尋找的解決方案,因爲它延伸了很多代碼,因此看起來更復雜。但是 - 這是最重要的 - 它運行良好。

0

我不認爲你可以在一個ControlTemplate中有多個VSM。

爲什麼不使用一個VSM切換兩者。

<ControlTemplate> 
    <Grid x:Name="PART_Content"> 
    <Grid x:Name="PART_HorizontalTemplate"> 
     ... 
    </Grid> 
    <Grid x:Name="PART_VerticalTemplate"> 
     ... 
    </Grid> 
<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup> 
    <VisualState x:Name="Vertical"> 
     <Storyboard> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_HorizontalTemplate" 
             Storyboard.TargetProperty="Visibility"> 
      <DiscreteObjectKeyFrame Value="{x:Static Visibility.Collapsed}" KeyTime="0"/> 
     </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
    </VisualState> 
    <VisualState x:Name="Horizontal"> 
<Storyboard> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_VerticalTemplate" 
             Storyboard.TargetProperty="Visibility"> 
      <DiscreteObjectKeyFrame Value="{x:Static Visibility.Collapsed}" KeyTime="0"/> 
     </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
    </VisualState> 
    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 
    </Grid> 
</ControlTemplate> 
+0

啊,是的。我不打算切換垂直和水平模板:D當然,我這樣做。對不起,這是我爲了更好清晰而遺漏的代碼序列之一。但是它是相反的:( – Em1 2011-06-02 21:26:52

+0

所以,我的意思是,在水平(也是垂直)模板中,我想切換內部的元素(如軌道,拇指,重複按鈕),而這在上面的VSM中是不可能的碼。 – Em1 2011-06-02 21:28:39

相關問題