首页 文章

自定义/用户控制

提问于
浏览
1

我有这样的任务 - 创建联合两个控件的控件(来自WPFToolkit和标准工具栏的DataGrid) . 在很大程度上,它对工会的具体控制并不重要,我需要找出可用于构建我需要的常用实践 . 乍一看,我需要一些像用户控制,即控件的组合,我可以作为一个整体实现,然后重用 . 但是,我的任务要求我有可能在XAML中调整我的复合控件 . 所以,如果我编写工具栏和DataGrid,我希望它们的属性和事件都会暴露出来 . 所以我可以在XAML中设置两个,例如,datagrid列和工具栏:

(我故意在标签名称中添加空格,因为loacal解析器由于某种原因没有输入它们)

<MyDataGridToolBarControl>
<DataGrid>
        <DataGrid.Columns>
            <DataGridTextColumn Header="firstColumn">
            </DataGridTextColumn>
            <DataGridTextColumn Header="secondColumn"/>
        </DataGrid.Columns>
</DataGrid>
<ToolBar Background="{x:Null}"> 
        <Button ToolTip="New">
            <Image Source="New.png"/>
        </Button>
        <Button ToolTip="Save">
            <Image Source="Save.png"/>
        </Button>
        <Button ToolTip="Delete">
            <Image Source="Delete.png"/>
        </Button>               
</ToolBar>
</MyDataGridToolBarControl>

现在唯一适合我或者适合我的唯一决定是从Datarid继承自定义控件(因为DataGrid在这一对中更重要)并重新定义包括datagrid和toolbar的模板 . 这给了我数据网格的所有功能但是,如果我想获得工具栏部分,我需要通过代码来实现它,在viual和逻辑树中寻找它,即以编程方式访问它,这不是很好的决定 . 请帮助新手来解决这个任务)在此先感谢...

1 回答

  • 1

    如果只是想让外部用户通过Xaml访问网格的每个属性和工具栏的每个属性然后使用合成,你可以创建一个usercontrol并公开这两个控件:

    <UserControl>
    
        <StackPanel>
            <ToolBar x:Name="ToolBar" x:FieldModifier="Public" />
            <DataGrid x:Name="Grid" x:FieldModifier="Public" />         
        </StackPanel>
    
    <UserControl>
    

    这种方法的问题是用户无法覆盖网格和工具栏的布局,因为它是用户控件 . 但是,它们可以完全覆盖工具栏和网格的模板和样式 .

    稍微好一点的方法是创建自定义控件(再次使用合成) . 您可以提供模板中的网格和工具栏,如下所示:

    <ControlTemplate>
            <StackPanel>
                <ToolBar x:Name="PART_ToolBar" />
                <DataGrid x:Name="PART_Grid" />         
            </StackPanel>
    </ControlTemplate>
    
    [TemplatePart("PART_ToolBar", typeof(ToolBar))]
    [TemplatePart("PART_Grid", typeof(DataGrid))]
    public class MyCustomControl : Control
    {
        private ToolBar _ToolBar;
        public ToolBar ToolBar {get{return _ToolBar;}}
    
        private DataGrid _Grid;
        public DataGrid Grid {get{return _Grid;}}
    
        protected overrides OnApplyTemplate()
        {
             _ToolBar = this.Template.FindName("PART_ToolBar", this) as ToolBar;
             _Grid = this.Template.FindName("PART_Grid", this) as DataGrid;
        }
    }
    

相关问题