2013-02-19 85 views
1

我使用代碼創建了一個列表視圖,並且我希望第二列包含一個超鏈接,該鏈接將打開默認瀏覽器並加載該URL。在列表視圖列中動態添加超鏈接

我創建的列表視圖這樣的:

GridView myGridView = new GridView(); 
myGridView.AllowsColumnReorder = false; 

ListView l1 = new ListView(); 

GridViewColumn gvc0 = new GridViewColumn(); 
gvc0.DisplayMemberBinding = new Binding("AA"); 
gvc0.Header = "A/A"; 
gvc0.Width = 30; 
myGridView.Columns.Add(gvc0); 
GridViewColumn gvc1 = new GridViewColumn(); 
gvc1.DisplayMemberBinding = new Binding("Description"); 
gvc1.Header = "Description"; 
gvc1.Width = 300; 
myGridView.Columns.Add(gvc1); 

l1.View = myGridView; 

而且我填的是列表視圖這樣的:

l1.Items.Add(new { AA = aa++, Description = descriptions}); 

我想說明的文字是一個超鏈接。它是否可行?

+0

在XAML中做這件事而不是這個愚蠢的代碼不是很容易嗎? – 2013-02-19 20:03:53

+0

也許,但我已經寫了這個'愚蠢的一段代碼'...如果我沒有找到解決方案,我會嘗試用xaml。 :-) – user1005633 2013-02-19 20:31:33

+0

在訴諸代碼之前,您應該總是嘗試使用XAML。 WPF不是winforms。 – 2013-02-19 20:35:53

回答

1

在代碼隱藏,你可以創建CellTemplate

GridView myGridView = new GridView(); 
myGridView.AllowsColumnReorder = false; 

ListView l1 = new ListView(); 

GridViewColumn gvc0 = new GridViewColumn(); 
gvc0.DisplayMemberBinding = new Binding("AA"); 
gvc0.Header = "A/A"; 
gvc0.Width = 30; 
myGridView.Columns.Add(gvc0); 

GridViewColumn gvc1 = new GridViewColumn(); 
gvc1.Header = "Description"; 
gvc1.Width = 300; 
FrameworkElementFactory fef = new FrameworkElementFactory(typeof(TextBlock)); 
FrameworkElementFactory hyperlinkHolder = new FrameworkElementFactory(typeof(Hyperlink)); 
hyperlinkHolder.SetBinding(Hyperlink.NavigateUriProperty, new Binding("Description")); 
hyperlinkHolder.AddHandler(Hyperlink.RequestNavigateEvent, new RequestNavigateEventHandler(Hyperlink_RequestNavigate)); 
FrameworkElementFactory fef2 = new FrameworkElementFactory(typeof(TextBlock)); 
Binding placeBinding = new Binding(); 
fef2.SetBinding(TextBlock.TextProperty, placeBinding); 
placeBinding.Path = new PropertyPath("Description"); 
hyperlinkHolder.AppendChild(fef2); 
fef.AppendChild(hyperlinkHolder); 
var dataTemplate = new DataTemplate(); 
dataTemplate.VisualTree = fef; 
dataTemplate.DataType = typeof(ListViewItem); 
gvc1.CellTemplate = dataTemplate;   
myGridView.Columns.Add(gvc1); 

l1.View = myGridView; 

事件處理程序:

private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) 
{ 
    Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri)); 
    e.Handled = true; 
} 

您應該使用XAML來做到這一點,它比所有GUI您在定義第一個解決方案更加清晰代碼隱藏。

<ListView Name="l1"> 
    <ListView.View> 
     <GridView> 
      <GridView.Columns> 
       <GridViewColumn Header="A/A" Width="30" DisplayMemberBinding="{Binding AA}" /> 
       <GridViewColumn Header="Description" Width="300"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock> 
           <Hyperlink NavigateUri="{Binding Description}" RequestNavigate="Hyperlink_RequestNavigate"> 
            <TextBlock Text="{Binding Description}" /> 
           </Hyperlink> 
          </TextBlock> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
      </GridView.Columns> 
     </GridView> 
    </ListView.View> 
</ListView> 
+0

感謝@kmatyaszek,它的工作就像一個魅力。 – 2014-07-30 13:14:09