Wpf 可以从XAML文件中使用XamlReader加载XAML文本块吗?

Wpf 可以从XAML文件中使用XamlReader加载XAML文本块吗?,wpf,xaml,xamlreader,Wpf,Xaml,Xamlreader,我在许多控件中使用以下数据模板: <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.mic

我在许多控件中使用以下数据模板:

<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>

有没有办法从XAML中使用XamlReader,这样我就可以简单地将数据模板的文本动态加载到XAML文件中?我在想象这样的事情(伪代码):


您不应该将XamlReader标记放在Xaml中(我甚至不知道这是否可行)。相反,您可以使用XamlReader类在代码中创建已编译的Xaml,并将其附加到父元素:

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

您可以将通用XAML放入ResourceDictionary:

XamlBlocks/DateTemplateManageButtons.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>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="XamlBlocks/DateTemplateManageButtons.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </pages:BasePageManageItems.Resources>
在使用数据模板的所有页面中实现该接口

在资源字典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);
}

执行此操作时,它会告诉我:“'ResourceDictionary'根元素需要一个x:Class属性来支持XAML文件中的事件处理程序。请删除MouseDown事件的事件处理程序,或向根元素添加一个x:Class属性。”当我添加x:Class属性时,会出现如下错误:“在'TestApp.Pages.BasePageManageItems'类型的声明中缺少部分修饰符”;这种类型的另一个部分声明存在“oops,没有注意到事件处理程序,我更新了答案-这使得基于ResourceDictionary的解决方案稍微复杂一些,但完全排除了基于XamlReader的解决方案(事件连接由编译器使用生成的代码完成,XamlReder无法处理事件)。
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); 
}
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);
}