Сроки с WPF - PullRequest
       28

Сроки с WPF

0 голосов
/ 19 октября 2018

Я работаю над приложением временной шкалы с использованием элемента управления DataGrid, но не могу найти способ вставить и связать элемент управления Canvas в ячейках.Должен ли я использовать другой элемент управления?

enter image description here

<UserControl x:Class="Timelines.Controls.TimelineViewer2"
         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:local="clr-namespace:Timelines.Controls"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
<Grid>
    <DataGrid Name="TimelineGrids" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Item" Binding="{Binding Name}"/>
            <DataGridTemplateColumn Header="Timeline" CanUserResize="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Canvas Name="TimelineCanvas"></Canvas>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

1 Ответ

0 голосов
/ 19 октября 2018

Существует два подхода к рисованию временных шкал.

Привязка данных и код позади

Первый использует привязку данных , котораявы уже на полпути;Таким образом, вы определяете модель данных и шаблон данных, запись в модели может иметь такие свойства, как Имя , Рожденный и Женат и Рожденные и Женат имеет целочисленное значение, например 1980, для обозначения года, а шаблон данных определяет способ визуального представления записи.

Другой подход заключается в использовании кода позади, построении Canvas и рисовании линий, меток на Canvas ... с использованием C #, а затем вставке Canvas в ячейку DataGrid.

Проблема:

А теперь вы застряли, потому что вы надеетесь смешать их, сначала используйте привязку данных, чтобы заполнить некоторые строки в DataGrid из данныхмодели, каждая строка имеет метку Name и Canvas, затем вы хотите получить доступ к Canvas для рисования с использованием кода позади.Поскольку Canvas создается с использованием привязки данных, вам трудно получить ссылку на него, вы даже не можете получить к нему доступ с именем TimelineCanvas, так как это имя имеет «область видимости шаблона» - то есть оно доступно толькоиз шаблона.

Можно получить доступ к Canvas из кода, используя VisualTreeHelper .См. Как: Найти элементы, сгенерированные DataTemplate .Но я не рекомендую этот «смешанный подход».

Решение

Придерживайтесь либо привязки данных (если вас устраивает XAML), либо кода.

Если вы выберете привязку данных, добавьте строки и метки внутренности DataTemplate, разумеется, вам необходимо рассчитать их положение на холсте - связав некоторые свойства в модели.

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <Canvas Name="TimelineCanvas">
            <Label Content="Born" Canvas.X="30" Canvas.Y="20" />
            <Line
                X1="10" Y1="30"
                X2="350" Y2="30"
                Stroke="Blue"
                StrokeThickness="1" />
            <!--The whole data template can be quite complicated, but here I just hard code a label and a line to get you started-->
        </Canvas>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

Если вы выберете код, удалите CellTemplate.

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <Canvas Name="TimelineCanvas"></Canvas>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

По моему мнению, оба подхода довольно сложны, вы можете определить UserControl для Timeline, поэтому логика построения может быть изолирована в одном отдельном классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...