2009-06-03 2 views
2

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

UserControl1:

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

Page1:

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

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

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

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

ответ

6

Я нашел ответ here.

Это можно сделать с помощью 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"; 
     } 
    } 
} 
+0

Вы можете мне помочь? см. мой комментарий по адресу: http://stackoverflow.com/questions/4251183/wpf-two-dimensional-datagrid-listview/4254842#4254842 – Shimmy

1

Нет, вы ничего не можете сделать в 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

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

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

+0

Можете ли вы привести пример кода, как вы бы достичь выше? – djskinner