2015-12-02 85 views
3

我正在進行8.1通用轉換爲UWP的過程。我在代碼隱藏中有一些代碼,它可以從視圖模型數據中以編程方式在堆棧面板中創建潛在的數百個節點。我正在嘗試向這些節點中的一些添加一些視覺響應規則。以編程方式在代碼背後添加視覺狀態設置器

我使用的模式基本上是:

foreach (var item in ViewModel.items) 
{ 
    var fooStackPanel = CreateItemRowStackPanel(); 

    fooStackPanel.Children.Add(CreateItemImage(item.ProductUrl)); 
    fooStackPanel.Children.Add(CreateItemNameTextBlock(item.Name)); 
    // ... 

    LayoutGrid.Children.Add(fooStackPanel); 
} 

某處在那裏,我想一個負責任的規則添加到特定節點。

以下是我希望在XAML中看到的方式,但我需要在後面的代碼中執行這些設置。我該怎麼做?

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup x:Name="WindowStates"> 
     <VisualState x:Name="NarrowState"> 
      <VisualState.StateTriggers> 
       <AdaptiveTrigger MinWindowWidth="0" /> 
      </VisualState.StateTriggers> 

      <VisualState.Setters> 
       <!-- How do I add these programmatically in the code behind? --> 
       <Setter Target="Item1Image.Visibility" 
         Value="Collapsed" /> 
       <Setter Target="Item2Image.Visibility" 
         Value="Collapsed" /> 
       <!-- ... --> 
      </VisualState.Setters> 
     </VisualState> 
    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 
+0

好的。你的問題是什麼? –

+0

如何在後面的代碼中以編程方式添加這些代碼? – Noppadet

+4

使用帶有DataTemplate的ListView並綁定圖像的可見性不是很容易嗎? – Bart

回答

9

正如巴特說,它更容易能見度約束,但如果不爲你工作出於某種原因就是你可以從代碼隱藏添加VisualStateSetters這樣:

1)創建一個新的視覺狀態組

var vsg = new VisualStateGroup();

2)創建你的狀態

var vs = new VisualState()

你不能命名它,但沒有必要這麼做。如果你真的需要(例如,你想手動使用GoToState,你可以做 var vs = (VisualState) XamlReader.Load($"<VisualState x:Name=\"{*yournameinline*}\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" />");

3)添加您statetriggers:

vs.StateTriggers.Add(new AdaptiveTrigger { MinWindowWidth = 0.0 });

4)添加您的制定者:

vs.Setters.Add(new Setter 
    { 
    Target = new TargetPropertyPath 
     { 
      Path = new PropertyPath("(Image.Visibility)"), 
      Target = *yourimage* 
     }, 
    Value = Visibility.Collapsed 
}); 

5)抓住控件的視覺狀態組並添加一切:

vsg.States.Add(vs);

VisualStateManager.GetVisualStateGroups(*yourcontrol*).Add(vsg)

相關問題