WPF UserControl 如何做到继承方式共享 XAML

XBodhi. 2013-04-03 02:50:49
如题:
经过确定,WPF 中 UserControl 和 Window 不一样,UserControl 无法实现 Xaml共享

所以有如下问题:

我自己写了一个 ContentTemplateUC.xaml 文件 如下图


如果图片看不见 xaml代码如下:
<UserControl x:Class="AFIS.EMS.SimpleWPF.UserControls.ContentTemplateUC"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:CustomPage="clr-namespace:AFIS.EMS.SimpleWPF.UserControls"
mc:Ignorable="d"
d:DesignHeight="600" d:DesignWidth="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="300"/>
<RowDefinition Height="5"/>
<RowDefinition Height="*"/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>

<GroupBox Grid.Column="0" Header="未设置" Margin="5,0,5,0" BorderBrush="LightBlue" BorderThickness="1">

</GroupBox>
<DockPanel Grid.Row="2">
<DataGrid HorizontalAlignment="Stretch" Margin="5,0,5,0">
<DataGrid.Columns>
<DataGridCheckBoxColumn/>
<DataGridTextColumn Header="ID" />
<DataGridTextColumn Header="CPU" />
<DataGridTextColumn Header="主频" />
<DataGridTextColumn Header="测试字段1" />
<DataGridTextColumn Header="测试字段2" />
<DataGridTextColumn Header="测试字段3" />
<DataGridTextColumn Header="测试字段4" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
<CustomPage:PageUC Grid.Row="3" HorizontalAlignment="Center" VerticalAlignment="Stretch"/>
</Grid>
</UserControl>



假设我有另一个 UserControl 如何 享有上个 Userconrol 的Xaml ,就和asp.net 中MasterPage一样,或是 winform种的 继承那样。

GroupBox 就是我将要动态的 部分。

如果用 c# 直接 赋值的话,这种方法不是我想要的。
...全文
681 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2013-04-08
  • 打赏
  • 举报
回复
引用 9 楼 qiaohuyue 的回复:
我今天刚试了下,XAML按照你的方法可以了 可是我去初始化 ServerUC 的时候 不显示 C# code?12345678910111213141516171819#region 引用 using System;using System.Windows.Forms;using AFIS.EMS.SimpleWPF.Client.UserControls;……
你的回帖速度太慢,我基本把这个帖子遗忘了(沉底了)。 我给你写了2个示例项目,一个是自定义控件的dll,另一个是调用的WinForm调用它,直接在你的解决方案中加载这2个项目测试下效果即可,反正我试下来都是正常的。 http://download.csdn.net/detail/qldsrx/5234165
XBodhi. 2013-04-07
  • 打赏
  • 举报
回复
有人知道吗 即便用 父类转换也不行
XBodhi. 2013-04-06
  • 打赏
  • 举报
回复
200 分的诱惑 还只有2个 牛人来 ,没有人光顾我的帖子啊
XBodhi. 2013-04-06
  • 打赏
  • 举报
回复
我今天刚试了下,XAML按照你的方法可以了 可是我去初始化 ServerUC 的时候 不显示
#region 引用

using System;
using System.Windows.Forms;
using AFIS.EMS.SimpleWPF.Client.UserControls;

#endregion
namespace AFIS.EMS.SimpleWPF.Client.Views
{
    public partial class ContentTemplateForm : Form
    {
        public ContentTemplateForm()
        {
            InitializeComponent();          
            this.elementHostTreeView.Child = new LeftTreeViewUC();
            this.elementHostRight.Child = new ServerUC();
        }
    }
}
qldsrx 2013-04-03
  • 打赏
  • 举报
回复
引用 5 楼 qiaohuyue 的回复:
我没有太明白,他是如何填充的,
这里的xaml文件和cs文件是分开的,没有从属关系,那个xaml文件是需要在Themes\Generic.xaml里面注册才能被识别,方法如下:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/当前命名空间的名称;component/Themes/BasePage.Generic.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
另外对于你顶楼给的代码,需要修改很简单,将<UserControl></UserControl>标签内部的代码复制到我所给示例代码的<ControlTemplate TargetType="{x:Type local:BasePage}">标签内部,然后找你需要添加添加内容的位置插入标签<ContentPresenter />即可,但只能插入一处。
XBodhi. 2013-04-03
  • 打赏
  • 举报
回复
WPF 好多东西不知道还, 菜鸟了
七神之光 2013-04-03
  • 打赏
  • 举报
回复
XBodhi. 2013-04-03
  • 打赏
  • 举报
回复
我没有太明白,他是如何填充的,
XBodhi. 2013-04-03
  • 打赏
  • 举报
回复
我试下啊,
qldsrx 2013-04-03
  • 打赏
  • 举报
回复
通过继承就可以共享了,非常简单,比WinForm更容易做到。 “UserControl 无法实现 Xaml共享”这命题就是错误的。 举例如下:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type local:BasePage}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:BasePage}">
                    <Grid Background="White" Opacity="0.8">
                        <Grid Name="ToolbarGrid" Height="48" VerticalAlignment="Top" >
                            <StackPanel Name="Toolbar" Margin="6,0,0,0" Orientation="Horizontal"  />
                        </Grid>    
                        <Grid Name="MainGrid" Margin="0,48,0,0">
                            <ContentPresenter />
                        </Grid>                        
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>    
</ResourceDictionary>

    public class BasePage : System.Windows.Controls.UserControl
    {
        static BasePage()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(BasePage), new FrameworkPropertyMetadata(typeof(BasePage)));
        }

        private static readonly DependencyProperty TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(BasePage), new FrameworkPropertyMetadata(string.Empty));

        public string Title
        {
            get { return GetValue(TitleProperty).ToString(); }
            set { SetValue(TitleProperty, value); }
        }
    }
这里定义了一个叫BasePage的UserControl,用来替代系统的Page,然后自己添加了一个叫Title的属性。布局样式通过ResourceDictionary来指定,其中<ContentPresenter />部分就是留给派生类填充的,当一个派生类继承这个BasePage后,所有设计的xmal代码自动填充<ContentPresenter />的位置,同时共享父类所有资源。
XBodhi. 2013-04-03
  • 打赏
  • 举报
回复
你那种方式 不支持 包含xaml
gxingmin 2013-04-03
  • 打赏
  • 举报
回复
UserControl也可以继承啊,子类xaml里加上下面的红色部分 <local:ContentTemplateUC x:Class="AFIS.EMS.SimpleWPF.UserControls.ChildUserControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:AFIS.EMS.SimpleWPF"

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧