Соединение ширины/высота ячейки в двух разных контролях?
-
30-09-2019 - |
Вопрос
Мне нужно создать два элемента управления, которые содержат одинаковые элементы (динамическое количество), первое элемент управления представляет клавиши, второе представляет значения.
Мне это нужно, чтобы, когда пользователь изменяет размер ширины верхнего столбца, она должна влиять на один и тот же столбец в нижней строке (значений).
Вот пример того, чего я хочу:
<Window
DataContext="{Binding RelativeSource={RelativeSource Self}}"
x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Window.Resources>
<ItemsPanelTemplate x:Key="ItemsPanelTemplate">
<VirtualizingStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</Window.Resources>
<StackPanel>
<ItemsControl ItemsSource="{Binding Keys}"
ItemsPanel="{StaticResource ItemsPanelTemplate}"/>
<ItemsControl Grid.Row="1" ItemsSource="{Binding Values}"
ItemsPanel="{StaticResource ItemsPanelTemplate}"/>
</StackPanel>
</Window>
Imports System.Collections.Specialized
Class MainWindow
Private Sub Window_Loaded(ByVal sender As Object,
ByVal e As RoutedEventArgs) Handles MyBase.Loaded
DataContext =
New StringDictionary From
{
{"key1", "value1"},
{"key2", "value2"},
{"key3", "value3"},
{"key4", "value4"}
}
End Sub
End Class
Результат:
Опять же, я хочу иметь возможность создать управление, подобное DataGrid, который даже поддерживает границы ячеек, а ширина ячейки и высоты должны быть подключены к ширине других элементов управления + разрешить изменение размера.
Я предпочитаю, чтобы это было сделано XAMLY. Примечание. Это пользовательский элемент управления, поэтому я могу объявить соответствующие свойства, если это необходимо. Но помните, что высота и ширина ячеек должны быть динамическими и индивидуальными для конкретных столбцов/рядов.
В отношении это Вопрос, я создал его немного по -другому (имея третий контроль для ячеек), но вопрос остается таким же, я хочу, чтобы ширина высоты колонн и ячеек была динамической, и дал пользователю способность изменения размера их влияет на друг с другом.
ОБНОВИТЬ
Ответ дециклона это то, что я хотел бы реализовать, но я попробовал пример, который он дал настройку ItemsControl
S ' Grid.IsSharedSizeScope
Собственность TO True, но это не сработало, вот результат (обрезанный):
Можно ли применить общий размер масштабов между двумя различными элементами управления?
Решение
Я что -то попробовал и, кажется, работает:
Xaml:
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication2"
Title="MainWindow"
Height="350"
Width="525">
<Window.Resources>
<local:GroupNameGenerator x:Key="GroupNameGenerator1" />
<local:GroupNameGenerator x:Key="GroupNameGenerator2" />
</Window.Resources>
<Grid>
<StackPanel Grid.IsSharedSizeScope="True">
<ItemsControl Name="ItemsControl1">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="{Binding Converter={StaticResource GroupNameGenerator1}}" />
</Grid.ColumnDefinitions>
<Border BorderBrush="Black"
BorderThickness="1"
Margin="5"
Padding="5">
<TextBlock Text="{Binding}" />
</Border>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl Name="ItemsControl2">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="{Binding Converter={StaticResource GroupNameGenerator2}}" />
</Grid.ColumnDefinitions>
<Border BorderBrush="Black"
BorderThickness="1"
Margin="5"
Padding="5">
<TextBlock Text="{Binding}" />
</Border>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Grid>
</Window>
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
namespace WpfApplication2
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
ObservableCollection<Int32> list1 = new ObservableCollection<Int32>();
ObservableCollection<String> list2 = new ObservableCollection<String>();
public MainWindow()
{
InitializeComponent();
for (int i = 0; i < 25; i++)
{
list1.Add(i + 1);
list2.Add(new String('0', ((i + 1) / 3)));
}
ItemsControl1.ItemsSource = list1;
ItemsControl2.ItemsSource = list2;
}
}
public class GroupNameGenerator : IValueConverter
{
public Int32 Index { get; set; }
public GroupNameGenerator()
{
Index = 0;
}
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return String.Format("Group{0}", ++Index);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
Другие советы
Привет, проверьте следующую ссылку для образца.sites.google.com/site/html5tutorials/paralleldatabinding.zip
Прикрепленный образец оптимизирован столбца. т.е. большое количество столбцов и меньшее количество рядов. Образец содержит 50 тысяч колонн и 10 строк. Делает меньше чем секунду.