我正在學習WPF和新手。我有這個要求。在視圖模型中,我有一個時間跨度對象。我想將時間範圍顯示爲「每小時一個實心圓」。什麼是以WPF方式做到這一點的最佳方式。我嘗試了ItemsTemplate,但無法找到一種方法來做到這一點。以WPF MVVM方式動態創建圈子
回答
看看這個article about creating a Rating Control它會非常相似。
關於此問題的唯一MVVM事情可能是如何收集應顯示在控件中的實際值。但是構建一個控件與MVVM沒有多大關係。
讓我們知道你是否陷入困境並嘗試提出具體問題。
一種選擇是創建自定義控件,該控件將生成以糾正代碼中的圓圈數量,但如果您更願意主要使用XAML,則有幾個選項。
如果要在面板內生成圓圈,可以使用ItemsControl
執行生成。生成的項目是圓圈,所以你需要一個視圖模型屬性和每個整個小時的元素。這些元素沒有任何特性,可以簡單地Object
類型:
public ObservableCollection<Object> Items { get; private set; }
您可以在收藏更新對象的數量:
Items.Clear();
var item = new Object();
for (var i = 0; i < timeSpan.Hours; i += 1)
Items.Add(item);
一個簡單的觀點則是:
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Ellipse Width="25" Height="25" Fill="Black" StrokeThickness="0" Margin="10"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
如果要以難以使用面板的方式佈局圓形,則可以在XAML中手動佈局24個圓形。然後,您可以使用值轉換器基於表示小時視圖模型屬性爲隱藏或顯示每圈:
// Remember to fire INotifyPropertyChanged.PropertyChanged when value changes.
public Int32 Hours { get; private set; }
值變換器然後將數字轉換成可見性:
class VisibilityConverter : IValueConverter {
public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture) {
var hours = System.Convert.ToInt32(value);
var visibleBelow = System.Convert.ToInt32(parameter);
// Alternatively use Visibility.Collapsed to completely remove the circle.
return hours <= visibleBelow ? Visibility.Visible : Visibility.Hidden;
}
public Object ConvertBack(Object value, Type targetType, Object parameter, CultureInfo culture) {
throw new NotImplementedException();
}
}
<Ellipse
Visibility="{Binding Hours, Converter={StaticResource VisibilityConverter}, ConverterParameter=3}"/>
:然後,每個
Ellipse
將使用
ConverterParameter
標識
Ellipse
的小時綁定
Visibility
到
Hours
屬性
您還可以使用自定義面板來排列ItemsControl中的項目。請參閱ItemsControl.ItemsPanel http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemspanel.aspx – Gusdor
有很多方法可以做到這一點。這是一個你可以在原始XAML做
- 數據綁定的
ItemsControl
由 您的視圖模型生成布爾值的集合 - 一個布爾爲代表的每個小時。 - 設置
ItemsControl.ItemTemplate
到包括Ellipse
與 相同的高度和寬度,[顏色] - 使用Actions/behaviors的邊界設置
Ellipse
到 [顏色]的填充時DataContext
等於系統的模板。布爾 真正
使用這種方法,你將需要調用每一次他們中的一個變化提高的PropertyChanged對整個布爾集合。
- 1. 在MVVM中創建WPF動態面板
- 2. MVVM WPF創建子元素
- 3. 動態創建WPF MVVM中的TabControl和子網格
- 4. WPF使用MVVM模式創建動態行
- 5. 結合動態創建WPF UI對象的MVVM模式
- 6. 以遞歸方式創建動態樹
- 7. WPF MVVM StackPanel動態子類型
- 8. WPF通過MVVM動態構建ContextMenu
- 9. Java:創建圈子
- 10. 在MVVM中動態創建控件
- 11. svg創建圈子
- 12. 使用WPF和MVVM動態創建行和列
- 13. WPF MvvM DataGrid動態列
- 14. WPF MVVM中的動態TabControl
- 15. MVVM中的動態創建MenuItem分隔符的WPF光學樣式
- 16. three.js - 創建可拖動的圈子
- 17. jquery創建圈子,讓他們移動
- 18. 動態創建UserControl(WPF)
- 19. 動態創建WPF richtextbox
- 20. 動態創建WPF網格
- 21. C#MVVM如何動態創建視圖
- 22. iOS - 在MVVM中動態創建控件
- 23. 動態創建文本框MVVM?
- 24. HTML,CSS,Javascript在圈內創建圈子
- 25. WPF動畫與MVVM模式
- 26. CGContextAddArc:如何創建圈子?
- 27. 動態呈現控件的MVVM方式
- 28. Swift以動態高度以編程方式創建UIButton
- 29. 動態創建MVVM模式下的控件
- 30. 以靜態方式創建對象
是的,這是在我心中最後一個,如果我不發現任何東西。我正在尋找一個像集合+ ItemsControl的解決方案。我唯一的問題是我沒有一個集合,但在這裏有一個屬性,並且必須生成一個對象列表。無論如何感謝您的答案。 – ferosekhanj
如果你只有一個屬性,你爲什麼要尋找一個集合/ itemsControl?您可以根據需要輕鬆生成/添加儘可能多的圈子。這不是收藏品。來自我以前的UI開發經驗的 –
我同意自定義控件解決了這個問題。由於我是一個新手,我只是在探索WPF來找到一種可以通過數據綁定來聲明的方法。 – ferosekhanj