Пользовательский / пользовательский контроль - PullRequest
1 голос
/ 31 марта 2009

У меня есть такая задача - создать элемент управления, объединяющий два элемента управления (DataGrid из WPFToolkit и стандартную панель инструментов). В широком смысле, не имеет значения, какие именно элементы управления он объединяет, мне нужно выяснить общие методы, которые можно использовать для создания того, что мне нужно. На первый взгляд, мне нужно что-то вроде пользовательского элемента управления, то есть композиции элементов управления, которые я могу реализовать в целом и затем использовать повторно. Но моя задача требует, чтобы у меня была возможность настроить свой составной элемент управления в XAML. Поэтому, если я создаю панель инструментов и 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 более значимым в этой паре), и переопределить Template, включая как сетку данных, так и панель инструментов. Это дает мне всю мощь сетки данных, но, если я хочу получить часть Панели инструментов, мне нужно сделать это с помощью кода, ища его в визуальных и логических деревьях, то есть получить доступ к нему программно, что не является хорошим решением. Пожалуйста, помогите новичку решить эту задачу) Заранее спасибо ...

1 Ответ

1 голос
/ 31 марта 2009

Если просто нужно, чтобы пользователи извне обращались к каждому свойству сетки и каждому свойству панели инструментов через 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...