1

我有这样的任务 - 创建联合两个控件(来自 WPFToolkit 和标准工具栏的 DataGrid)的控件。在大范围内,它联合了哪些特定控件并不重要,我需要找出可用于构建我需要的东西的常见做法。乍一看,我需要像用户控件这样的东西,即控件的组合,我可以将其作为一个整体实现并在之后重用。但是,我的任务要求我能够在 XAML 中调整我的复合控件。因此,如果我组合 Toolbar 和 DataGrid,我希望它们的属性和事件都将被公开。所以我可以在 XAML 中设置,例如,数据网格的列和工具栏的栏:

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

<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 在这对中更重要)并重新定义模板,包括数据网格和工具栏。这给了我数据网格的所有力量,但是,如果我想获得工具栏部分,我需要通过代码来完成,在虚拟和逻辑树中寻找它,即以编程方式访问它,这不是一个很好的决定。请帮助新手解决此任务)在此先感谢...

4

1 回答 1

1

如果只是希望外部用户通过 Xaml 访问网格的每个属性和工具栏的每个属性,那么使用组合可以创建一个用户控件并像这样公开两个控件:

<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;
    }
}
于 2009-03-30T20:35:11.813 回答