Conexión de anchura / altura de célula en dos controles diferentes?
-
30-09-2019 - |
Pregunta
Necesito crear dos controles que contienen el mismo amound de objetos (una cantidad dinámica), el primer control representa las teclas, la segunda representa los valores.
I lo necesitan de manera que cuando el usuario cambia el tamaño de la columna superior anchura que debe afectar a la misma columna en la fila inferior (de los valores).
Este es un ejemplo de lo que deseo:
<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
Resultados:
Una vez más, quiero ser capaz de crear una cuadrícula de datos como de control que los bordes de celda incluso soportes y anchuras de células y alturas deben conectarse a los otros controles ancho + permiten cambio de tamaño.
Yo prefiero que se haga xamly. Nota: es un control personalizado, para que pueda declarar propiedades apropiadas si es necesario. pero alturas y anchura recordar de las células tiene que ser dinámico e individual a columnas / filas específicas.
En referencia a esta pregunta , he creado de una manera ligeramente diferente ( que tiene un tercer control para las células), pero la cuestión sigue siendo el mismo, quiero la anchura altura de las columnas y de las células a ser dinámico, y dar a la capacidad del usuario para cambiar el tamaño de ellas, que afecten entre sí.
Actualizar
de decyclone respuesta es algo que le encantaría poner en práctica, pero me trató el ejemplo que proporciona el establecimiento de la propiedad ItemsControl
los Grid.IsSharedSizeScope
s' de verdad, pero no funcionó, aquí está el resultado (recortada):
¿Es posible aplicar un alcance tamaño compartida entre dos controles diferentes?
Solución
He intentado algo y parece que funciona:
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>
Código:
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();
}
}
}
Otros consejos
Hola comprobar el siguiente enlace para la muestra. sites.google.com/site/html5tutorials/ParallelDataBinding.zip
El ejemplo adjunto es la columna optimizado. es decir., gran número de columnas y menos número de filas. La muestra contiene 50K columnas y 10 filas. Renders menos de un segundo.