Collegamento larghezza / altezza della cella in due diversi controlli?
-
30-09-2019 - |
Domanda
necessario creare due controlli che contengono lo stesso amound di elementi (una quantità dinamica), il primo controllo rappresenta le chiavi, il secondo rappresenta i valori.
I bisogno in modo che quando l'utente ridimensiona la colonna superiore larghezza dovrebbe influenzare la stessa colonna nella fila inferiore (dei valori).
Ecco un esempio di ciò che desidero:
<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
Risultato:
Ancora una volta, voglio essere in grado di creare un DataGrid simile controllo che i bordi delle celle anche i supporti e di larghezza e altezza devono essere collegati agli altri controlli width + permettono di ridimensionamento.
Io preferisco che sia fatto xamly. Nota: si tratta di un controllo personalizzato, in modo da poter dichiarare proprietà appropriate se necessario. ma altezze e larghezza ricordare delle celle deve essere dinamico e individualmente specifiche colonne / righe.
In riferimento a questa domanda , ho creato in un modo leggermente diverso ( avere un terzo controllo per le cellule), ma la domanda è sempre la stessa, voglio che la larghezza altezza delle colonne e delle cellule da dinamica, e dare la possibilità all'utente di ridimensionare li influenzano a vicenda.
Aggiorna
di decyclone risposta è qualcosa che mi piacerebbe realizzare, ma ho provato l'esempio ha fornito impostando la proprietà ItemsControl
le Grid.IsSharedSizeScope
s' al vero, ma non ha funzionato, ecco il risultato (ritagliata):
E 'possibile applicare un ambito dimensione condivisa tra due controlli diversi?
Soluzione
ho provato qualcosa e sembra funzionare:
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>
Codice:
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();
}
}
}
Altri suggerimenti
Ciao a controllare il seguente link per il campione. sites.google.com/site/html5tutorials/ParallelDataBinding.zip
Il campione è allegata colonna ottimizzata. cioè., grande numero di colonne e meno numero di righe. Il campione contiene 50K colonne e 10 righe. Rende meno di un secondo.