Сетка WPF для пользовательских элементов управления? - PullRequest
3 голосов
/ 03 июня 2009

В ASP.NET я мог создать пользовательский элемент управления, чтобы он занимал более одной ячейки в таблице на странице:

UserControl1:

<tr>
  <td>foo</td>
  <td>bar</td>
</tr>

Page1:

<table>
  <put a UserControl1 here/>
  <put another UserControl1 here/>
</table>

и ширина столбцов автоматически настраивается для соответствия наибольшему пользовательскому элементу управления.

Можно ли это сделать и в WPF? Как?

Я думаю, что пользовательские элементы управления не могут этого сделать, и я должен создать простой класс вместо пользовательского элемента управления, у которого есть метод для добавления всего в сетку. Но в этом случае все должно быть сделано кодом, xaml здесь бесполезен.

Ответы [ 3 ]

7 голосов
/ 03 июня 2009

Я нашел ответ здесь .

Это можно сделать с помощью SharedSizeGroup и Grid.IsSharedSizeScope.

UserControl1.xaml:

<UserControl x:Class="WpfApplication1.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition SharedSizeGroup="SharedSizeGroup1"/>
            <ColumnDefinition SharedSizeGroup="SharedSizeGroup2"/>
        </Grid.ColumnDefinitions>
        <Label Name="Label1" Grid.Column="0">Label1</Label>
        <Label Name="Label2" Grid.Column="1">Label2</Label>
    </Grid>
</UserControl>

Window1.xaml:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:y="clr-namespace:WpfApplication1">
    <Grid Grid.IsSharedSizeScope="True">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <y:UserControl1 Grid.Row="0" x:Name="UserControl1A"/>
        <y:UserControl1 Grid.Row="1" x:Name="UserControl1B"/>
    </Grid>
</Window>

Window1.xaml.cs:

using System.Windows;

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            UserControl1A.Label1.Content = "Label1WithLongText";
        }
    }
}
1 голос
/ 03 июня 2009

Нет, вы не можете делать ничего подобного в XAML.

Пользовательские элементы управления ASP.NET испускают HTML. Ваш пользовательский элемент управления выдает HTML для строки таблицы. Учитывая, что выдаваемая разметка имеет смысл в разметке формы, то, что вы делаете, возможно, но не очень хорошая практика, поскольку контроль полностью зависит от разметки на странице, чтобы иметь какой-либо смысл. Кроме того, размер и размещение элемента управления на странице должны быть обязанностью страницы, а не элемента управления. Все дело в инкапсуляции.

Элементы управления WPF, конечно, не генерируют разметку. Скорее, они создаются в окне / странице WPF и живут как визуальные элементы управления в окне. Совсем другая ситуация.

Чтобы ваш элемент управления охватывал несколько столбцов, вы должны использовать атрибут расширения Grid.ColumnSpan, например:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <MyControl Grid.ColumnSpan="2" Name="myControl">Button</Button>
</Grid>
0 голосов
/ 03 июня 2009

Я бы не рекомендовал, чтобы пользовательский элемент управления определял, как он должен занимать ячейки таблицы / сетки в хосте. Страница / окно, на котором размещен пользовательский элемент управления, должны определять способ отображения пользовательского элемента управления. Таким образом, вы можете поместить пользовательские элементы управления в сетку WPF и использовать атрибут Grid.ColumnSpan, чтобы пользовательский элемент управления занимал несколько столбцов в сетке.

Элемент управления в конечном итоге станет более удобным, и разделение ответственности будет сохранено.

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