2009-11-26 80 views
0

我用下面的DataTemplate在許多控制:是否可以使用XAML文件中的XamlReader加載一個XAML文本塊?

<pages:BasePageManageItems x:Class="TestApp.Pages.PageManageAddresses" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:pages="clr-namespace:TestHistorierung.Pages" 
    xmlns:tk="http://schemas.microsoft.com/wpf/2008/toolkit" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      Background="#eee" 
      VerticalAlignment="Stretch"> 
    <pages:BasePageManageItems.Resources> 
     <DataTemplate x:Key="manageAreaCellTemplate"> 
      <Border Padding="2"> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Style="{DynamicResource ManageLinkStyle}" 
        Tag="{Binding Id}" Text="Delete" MouseDown="System_Delete_Click" 
        Margin="0 0 5 0"/> 
        <TextBlock Style="{DynamicResource ManageLinkStyle}" 
        Tag="{Binding Id}" Text="Edit" MouseDown="System_Edit_Click" 
        Margin="0 0 5 0"/> 
        <TextBlock Style="{DynamicResource ManageLinkStyle}" 
        Tag="{Binding Id}" Text="Add" MouseDown="System_Add_Click" 
        Margin="0 0 5 0"/> 
        <TextBlock Style="{DynamicResource ManageLinkStyle}" 
        Tag="{Binding Id}" Text="Copy" MouseDown="System_Copy_Click" 
        Margin="0 0 5 0"/> 
       </StackPanel> 
      </Border> 
     </DataTemplate> 
    </pages:BasePageManageItems.Resources> 

有沒有辦法使用XamlReader從XAML,這樣我可以在DataTemplate中的文本簡單地加載到XAML文件動態?我想象這樣的事情(僞代碼):

<pages:BasePageManageItems x:Class="TestApp.Pages.PageManageAddresses" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:pages="clr-namespace:TestHistorierung.Pages" 
    xmlns:tk="http://schemas.microsoft.com/wpf/2008/toolkit" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      Background="#eee" 
      VerticalAlignment="Stretch"> 
    <pages:BasePageManageItems.Resources> 
     <XamlReader Load="XamlBlocks/DateTemplateManageButtons.xaml"/> 
    </pages:BasePageManageItems.Resources> 

回答

1

你不應該放置在XAML中XamlReader標籤(我甚至不知道這是否是可能的)。相反,你可以使用XamlReader類代碼來創建編譯XAML中,並將其連接到父元素:

var element = XamlReader.Load(stringContainingXaml); 
this.somePanel.Children.Insert(0, element as FrameworkElement); 
1

您可以把常用的XAML在ResourceDictionary中:

XamlBlocks/DateTemplateManageButtons.xaml(加入項目建設行動=頁)

<ResourceDictionary x:Class="myNmaespace.DateTemplateManageButtons" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <DataTemplate x:Key="manageAreaCellTemplate"> 
      <Border Padding="2"> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Style="{DynamicResource ManageLinkStyle}" 
        Tag="{Binding Id}" Text="Delete" MouseDown="System_Delete_Click" 
        Margin="0 0 5 0"/> 
        <TextBlock Style="{DynamicResource ManageLinkStyle}" 
        Tag="{Binding Id}" Text="Edit" MouseDown="System_Edit_Click" 
        Margin="0 0 5 0"/> 
        <TextBlock Style="{DynamicResource ManageLinkStyle}" 
        Tag="{Binding Id}" Text="Add" MouseDown="System_Add_Click" 
        Margin="0 0 5 0"/> 
        <TextBlock Style="{DynamicResource ManageLinkStyle}" 
        Tag="{Binding Id}" Text="Copy" MouseDown="System_Copy_Click" 
        Margin="0 0 5 0"/> 
       </StackPanel> 
      </Border> 
     </DataTemplate> 
    </ResourceDictionary> 

XamlBlocks/DateTemplateManageButtons.xaml.cs:

namespace myNamespace 
{ 
    public partial class DateTemplateManageButtons : ResourceDictionary 
    { 
     private void System_Delete_Click(object sender, RoutedEventArgs e) 
     { 
      // event handler code 
     } 
     // other event handlers 
    } 
} 

而在你的頁面:

<pages:BasePageManageItems x:Class="TestApp.Pages.PageManageAddresses" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:pages="clr-namespace:TestHistorierung.Pages" 
    xmlns:tk="http://schemas.microsoft.com/wpf/2008/toolkit" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      Background="#eee" 
      VerticalAlignment="Stretch"> 
    <pages:BasePageManageItems.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="XamlBlocks/DateTemplateManageButtons.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </pages:BasePageManageItems.Resources> 

如果你需要的事件處理程序代碼在網頁上運行,而不是資源字典,你可以這樣做:

定義接口的事件:

public interface IDateTemplateManageButtonsEvents 
{ 
    void System_Delete_Click(object sender, RoutedEventArgs e); 
} 

實現在使用數據模板

在資源字典CS文件中的所有網頁該接口:

private IDateTemplateManageButtonsEvents FindPage(object sender) 
{ 
    DependencyObject current = sender as DependencyObject; 
    while(current != null && !(current is IDateTemplateManageButtonsEvents)) 
    { 
     current = VisualTreeHelper.GetParent(current); 
    } 
    return (IDateTemplateManageButtonsEvents)current; 
} 
private void System_Delete_Click(object sender, RoutedEventArgs e) 
{ 
    FindPage(sender).System_Delete_Click(sender, e); 
} 
+0

當我這樣做時它告訴我:「'ResourceDictionary'根元素需要x:Class屬性來支持XAML文件中的事件處理程序。要麼刪除MouseDown事件的事件處理程序,要麼將ax:Class屬性添加到根元素中。「當我添加x:Class屬性時,出現類似如下的錯誤:」缺少對'TestApp.Pages'類型聲明的部分修飾符。 BasePageManageItems';另一個此類型的部分聲明存在「 – 2009-11-26 16:57:25

+0

oops,沒有注意到事件處理程序,我更新了答案 - 這使基於ResourceDictionary的解決方案稍微複雜一些,但完全排除基於XamlReader的解決方案(事件接線由帶有生成代碼的編譯器,XamlReder無法處理事件)。 – Nir 2009-11-29 09:54:43

相關問題