2014-10-01 427 views
0

我已經在代碼中創建了帶有GridView的ListView。如何在代碼中向WPF ListView添加邊框

ListView gridList = new ListView(); 
GridView gridListView = new GridView(); 
gridList.View = gridListView; 

現在我定義一個GridViewColumn,設置header,width和bindingPath。所有好的和數據顯示出來。

GridViewColumn listColumn = new GridViewColumn(); 
listColumn.Header = "Some Header"; 
listColumn.Width = 100.0; 
listColumn.DisplayMemeberBinding = new Binding("Name"); 
gridListView.Columns.Add(listColumn); 

但是這個ListView沒有顯示任何邊框/網格線。我怎樣才能通過代碼添加邊框?

有人在這裏描述我確切的問題,但沒有很好的解決方案中提到 http://social.msdn.microsoft.com/Forums/en-US/fa4fa8e0-81fe-487a-8763-590062d29c06/wpf-listview-gridview-row-border?forum=wpf

+0

刪除所有內容並使用正確的XAML。 – 2014-10-01 13:31:42

+0

我不能使用XAML,因爲我必須動態地創建這個控件,這個控件被渲染成一個XPS文件。 – 2014-10-01 13:41:30

回答

0

我建議你看這個link,它包含了創建一個動態的GridView控件代碼隱藏可以爲您的特定情況下非常有用。對於您提供的代碼示例,您沒有添加ShowGridLines屬性。

+0

謝謝,但在我的情況下,我使用的是ListView,並且您提供的鏈接使用了Grid。我有我需要的一切異常我缺少網格線。另外,ShowGridLines屬性用於Grid類而不是ListView類:-( – 2014-10-01 14:03:28

1

WPF編程中的邏輯與您在winforms中完成的邏輯完全不同。與UI相關的所有內容應始終使用XAML進行設置(儘可能多)。 WPF庫本身有許多部分主要用於XAML,儘管總是存在相當的代碼隱藏。然而,這就是使用代碼隱藏時可能會很笨拙和不直觀(以及直截了當)。

我知道你想要像Winforms中的ListView Grid那樣的東西。在WPF中,如果使用XAML代碼,可以輕鬆實現。即使在後面的代碼中,您始終可以從XAML字符串構建StyleTemplate(在XamlReader的幫助下)。這種方法適用於複雜的場景,但在這種情況下,我有另一種方法(根本不使用XAML解析器)。這一招確實呈現網格是足夠好(充其量它可以爲簡單的折衷做的):

//we need an instance of Style to set to ListView.ItemContainerStyle 
var style = new Style(typeof(ListViewItem)); 
//set the bottom border thickness to 1 
var setter = new Setter(Control.BorderThickness, new Thickness(0,0,0,1)); 
style.Setters.Add(setter); 
//set the border brush 
var borderBrush = new LinearGradientBrush { StartPoint = new Point(0,0), 
              EndPoint = new Point(1,0)}; 
var gradStop = new GradientStop(Colors.Transparent, 0.001); 
    borderBrush.GradientStops.Add(gradStop); 
gradStop = new GradientStop(Colors.Green, 0.001); 
    borderBrush.GradientStops.Add(gradStop); 
gradStop = new GradientStop(Colors.Green, 0.999); 
    borderBrush.GradientStops.Add(gradStop); 
gradStop = new GradientStop(Colors.Transparent, 0.999); 
    borderBrush.GradientStops.Add(gradStop); 
setter = new Setter(Control.BorderBrush, borderBrush); 
style.Setters.Add(setter); 

yourListView.ItemContainerStyle = style; 

注意,默認每個ListViewItemBorder有大約一個硬編碼CornerRadius 2,所以通過將底部BorderBrush設置爲實心畫筆,例如Brushes.Green,將在底部邊界的兩端顯示稍微向上的捲曲線。你可以自己嘗試。如果這個結果是可以接受的,該代碼可以是這樣的簡短一些(因爲你沒有定義GradientBrush到截止2捲曲的兩端):

setter = new Setter(Control.BorderBrush, Brushes.Green); 
style.Setters.Add(setter); 

如果該行爲依然沒有什麼你要。你應該嘗試我提到的關於使用XamlReader來解析XAML字符串並在代碼隱藏中得到你想要的任何實例的方法。 (你可以自己搜索它,很容易得到一些結果)。

+0

嘿,感謝一堆提到這種方法,我現在無法在GridView中獲得水平網格線,我需要將垂直線條作爲我查了一下GridViewColumn,它只有標題的樣式,而不是單個的單元格。你知道每列的垂直線是如何通過代碼獲得的麼? – 2014-10-02 07:10:38

+0

@NikhilNehriya我的答案中的代碼只是呈現水平線,實際上它是某種黑客/玩(假)邊界,但對於垂直線,做這樣的事很難實現。解決這個問題幾乎是不可能的。你可以嘗試使用'GridViewColumn.CellTemplate'玩。更改'CellTemplate'似乎是唯一的方法,但即使更改該模板,結果仍然不是很完美。問題是單元之間總是有一個空格(某種單元格間距)。 – 2014-10-02 21:19:23

+0

雅我正在用CellTemplate玩弄,但結果並不理想。想知道你是否知道更好的解決方法。有點奇怪,WPF世界中缺少這種基本的定製。無論如何,我現在有水平線感謝您的答案。會做那個。 – 2014-10-03 03:30:17