当前位置:  开发笔记 > 运维 > 正文

WPF:带有2个(或更多!)ContentPresenters的模板或UserControl,用于在'slots'中显示内容

如何解决《WPF:带有2个(或更多!)ContentPresenters的模板或UserControl,用于在'slots'中显示内容》经验,为你挑选了1个好方法。

我正在开发LOB应用程序,我将需要多个对话框窗口(并且在一个窗口中显示所有内容不是一个选项/没有意义).

我希望我的窗口有一个用户控件来定义一些样式等,并且可以有几个插入内容的插槽 - 例如,模态对话框窗口的模板将有一个内容插槽和按钮(这样用户就可以提供带有绑定ICommands的内容和按钮组.

我想有这样的东西(但这不起作用):

UserControl xaml:


    
        
            
        
        
            
        
    

这样的事情可能吗?我怎么告诉VS我的控件暴露了两个内容占位符,以便我可以像这样使用它?



    
        
            
        
        
            
        
    


或许我可以像这里一样使用ControlTemplate这样的窗口,但是又一次:Window只有一个内容插槽,因此它的模板只能有一个演示者,但我需要两个(如果在这种情况下它可能会po有可能与其中一个,有其他用例,其中有几个内容插槽,只需考虑文章的模板 - 控件的用户将提供标题,(结构化)内容,作者姓名,图像......).

谢谢!

PS:如果我想并排按钮,我怎样才能将多个控件(按钮)放到StackPanel上?ListBox有ItemsSource,但StackPanel没有,并且它的Children属性是只读的 - 所以这不起作用(在usercontrol中):

 

编辑:我不想使用绑定,因为我想将一个DataContext(ViewModel)分配给一个整个窗口(等于View),然后从插入控件'slots'的按钮绑定到它的命令 - 所以任何使用层次结构中的绑定会破坏View的DC的继承.

至于从HeaderedContentControl继承的想法 - 是的,在这种情况下它会工作,但如果我想要三个可替换的部分怎么办?如何创建自己的"HeaderedAndFooteredContentControl" (或者,如果我没有HeaderedContentControl,我将如何实现?)

EDIT2:好的,所以我的两个解决方案都不起作用 - 这就是为什么: ContentPresenter从DataContext获取它的内容,但是我需要对包含的元素进行绑定以链接到原始窗口'(UserControl的父逻辑树中)DataContext - 因为这样,当我嵌入文本框绑定到ViewModel的属性时,它没有绑定,因为继承链已在控件内部被破坏!

看来我需要保存父的DataContext,并将其恢复到所有控件容器的子节点,但我没有得到逻辑树中的DataContext更改的任何事件.

编辑3:我有一个解决方案!,删除了我之前的aswers.看看我的回复.



1> Tomáš Kafka..:

好的,我的解决方案完全没必要,以下是创建任何用户控件所需的唯一教程:

http://www.interact-sw.co.uk/iangblog/2007/02/14/wpfdefaulttemplate

http://www.codeproject.com/Articles/37326/Lookless-Controls-Themes.aspx

http://www.codeproject.com/Articles/35444/Defining-the-Default-Style-for-a-Lookless-Control.aspx

http://blog.pixelingene.com/?p=58

简而言之:

子类一些合适的类(或UIElement,如果不适合你) - 文件只是普通的*.cs,因为我们只定义行为,而不是控件的外观.

public class EnhancedItemsControl : ItemsControl

为'slot'添加依赖项属性(正常属性不够好,因为它只有有限的绑定支持).酷玩法:在VS中,编写propdp并按Tab键展开代码段:):

public object AlternativeContent
{
    get { return (object)GetValue(AlternativeContentProperty); }
    set { SetValue(AlternativeContentProperty, value); }
}

// Using a DependencyProperty as the backing store for AlternativeContent.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty AlternativeContentProperty =
    DependencyProperty.Register("AlternativeContent" /*name of property*/, typeof(object) /*type of property*/, typeof(EnhancedItemsControl) /*type of 'owner' - our control's class*/, new UIPropertyMetadata(null) /*default value for property*/);

为设计器添加属性(因为您正在创建所谓的无外观控件),这样我们就知道我们需要在模板中有一个名为PART_AlternativeContentPresenter的ContentPresenter

[TemplatePart(Name = "PART_AlternativeContentPresenter", Type = typeof(ContentPresenter))]
public class EnhancedItemsControl : ItemsControl

提供一个静态构造函数,告诉WPF样式系统关于我们的类(没有它,将不会应用以我们的新类型为目标的样式/模板):

static EnhancedItemsControl()
{
    DefaultStyleKeyProperty.OverrideMetadata(
        typeof(EnhancedItemsControl),
        new FrameworkPropertyMetadata(typeof(EnhancedItemsControl)));
}

如果要从模板中对ContentPresenter执行某些操作,可以通过重写OnApplyTemplate方法来执行此操作:

//remember that this may be called multiple times if user switches themes/templates!
public override void OnApplyTemplate()
{
    base.OnApplyTemplate(); //always do this

    //Obtain the content presenter:
    contentPresenter = base.GetTemplateChild("PART_AlternativeContentPresenter") as ContentPresenter;
    if (contentPresenter != null)
    {
        // now we know that we are lucky - designer didn't forget to put a ContentPresenter called PART_AlternativeContentPresenter into the template
        // do stuff here...
    }
}

提供一个默认模板:总是在ProjectFolder/Themes/Generic.xaml中(我的独立项目包含所有自定义的通用wpf控件,然后从其他解决方案中引用).这只是系统将为您的控件查找模板的地方,因此在此处为项目中的所有控件添加默认模板:在此片段中,我定义了一个新的ContentPresenter,它显示了我们AlternativeContent附加属性的值.注意语法 - 我可以使用 Content="{Binding AlternativeContent, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type WPFControls:EnhancedItemsControl}}}"或者Content="{TemplateBinding AlternativeContent}",但是如果你在模板中定义一个模板(例如ItemPresenters的样式化),前者将起作用.



    
    


瞧,你刚刚制作了第一个无表情的UserControl(为更多'内容插槽'添加更多内容提供者和依赖属性).


感谢上帝,有人以简单易懂的方式解释了这一点!很难找到关于这个的资源,或者它只是一个wpf-beginners错误:p
推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有