所以,大家好。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垂直與水平的外觀之間切換。
正如你在代碼序列看,視覺滑塊是由模板定義,這裏HorizontalSliderTemplate(我再次減少代碼):
<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等,不會有任何幫助。
在此先感謝。
啊,是的。我不打算切換垂直和水平模板:D當然,我這樣做。對不起,這是我爲了更好清晰而遺漏的代碼序列之一。但是它是相反的:( – Em1 2011-06-02 21:26:52
所以,我的意思是,在水平(也是垂直)模板中,我想切換內部的元素(如軌道,拇指,重複按鈕),而這在上面的VSM中是不可能的碼。 – Em1 2011-06-02 21:28:39