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);
}