यह "सरल समाधान" केवल एक फ्रीजबल पाद लेख के लिए है, जमे हुए हेडर समाधान थोड़ा अलग होगा (और वास्तव में बहुत आसान होगा - केवल हेडर टीमप्लेट के साथ खेलें - एक स्टैक पैनल डालें, जितनी चाहें उतनी चीजें स्टैक्ड हो जाएं)।
इसलिए मुझे एक फूटर पंक्ति की आवश्यकता है जो फ्रीज करने योग्य है, मुझे महीनों के लिए कुछ भी नहीं मिला, इसलिए अंततः मैंने आलसी होने और जांच करने का फैसला किया।
तो यदि आपको एक पाद लेख की आवश्यकता है, तो गस्ट को पंक्तियों और क्षैतिज स्क्रॉलव्यूअर के बीच डेटाग्रिड के टेम्पलेट में एक जगह मिलती है जहां आप अतिरिक्त ग्रिड निचोड़ सकते हैं। सेल के साथ आइटम नियंत्रण के साथ पंक्तियां। हमले की
योजना:
पहले, डेटा ग्रिड टेम्पलेट निकालने (मैं मिश्रण का इस्तेमाल किया)।
PART_ColumnHeadersPresenter
PART_ScrollContentPresenter
PART_VerticalScrollBar
सही PART_VerticalScrollBar के तहत, वहाँ एक ग्रिड है (मैं इसे स्पष्टता के लिए यहाँ पोस्ट करेंगे)
<Grid Grid.Column="1" Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ScrollBar x:Name="PART_HorizontalScrollBar" Grid.Column="1" Maximum="{TemplateBinding ScrollableWidth}" Orientation="Horizontal" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportWidth}"/>
</Grid>
ग्रिड मैं संशोधित है यही कारण है कि: टेम्पलेट से परिचित हो रही है, क्रम में भागों ध्यान दें एक "फ्रीजबल/पाद लेख पंक्ति" शामिल करने के लिए। मैं सिर्फ कड़ी मेहनत से कोड रंग करने के लिए जा रहा हूँ, और सादगी के लिए hoperfully उपयोगी "नाटक" गुणों के साथ बाइंडिंग की जगह (मैं उन्हें चिह्नित कर देंगे "MyViewModel.SomeProperty ताकि वे देख करने के लिए आसान कर रहे हैं):
<Grid Grid.Column="1" Grid.Row="2" x:Name="PART_DataGridColumnsVisualSpace">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=NonFrozenColumnsViewportHorizontalOffset}"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<ScrollBar Grid.Column="2" Grid.Row="3" Name="PART_HorizontalScrollBar" Orientation="Horizontal"
Maximum="{TemplateBinding ScrollableWidth}" ViewportSize="{TemplateBinding ViewportWidth}"
Value="{Binding Path=HorizontalOffset, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"
Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/>
<Border x:Name="PART_FooterRowHeader" Grid.Row="1" Height="30" Background="Gray" BorderBrush="Black" BorderThickness="0.5">
<TextBlock Margin="4,0,0,0" VerticalAlignment="Center">MY FOOTER</TextBlock>
</Border>
<ItemsControl x:Name="PART_Footer" ItemsSource="{Binding MyViewModel.FooterRow}"
Grid.Row="1" Grid.Column="1" Height="30">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="Gray" BorderThickness="0,0,0.5,0.5" BorderBrush="Black">
<!-- sticking a textblock as example, i have a much more complex control here-->
<TextBlock Text="{Binding FooterItemValue}"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.Template>
<ControlTemplate>
<ScrollViewer x:Name="PART_Footer_ScrollViewer" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"
CanContentScroll="True" Focusable="false">
<StackPanel IsItemsHost="True" Orientation="Horizontal"/>
</ScrollViewer>
</ControlTemplate>
</ItemsControl.Template>
</ItemsControl>
</Grid>
इसके अलावा करने के लिए जोड़ स्क्रॉल करने के लिए डेटा ग्रिड प्रतिक्रिया और हैडर आकार बदलने
<DataGrid ... ScrollViewer.ScrollChanged="OnDatagridScrollChanged"
<Style TargetType="DataGridColumnHeader">
<EventSetter Event="SizeChanged" Handler="OnDataColumnSizeChanged"/>
</Style>
अब, वापस .xaml.cs
मूल रूप से दो मुख्य बातों की जरूरत है में:
(1) सिंक स्तंभ आवासीय Ze (ताकि इसी पाद लेख सेल का आकार बदलता है) (2) पाद लेख स्क्रॉल
//syncs the footer with column header resize
private void OnDatagridScrollChanged(object sender, ScrollChangedEventArgs e)
{
if (e.HorizontalChange == 0.0) return;
FooterScrollViewer.ScrollToHorizontalOffset(e.HorizontalOffset);
}
//syncs scroll
private void OnDataColumnSizeChanged(object sender, SizeChangedEventArgs e)
{
//I don't know how many of these checks you need, skip if need to the gist
if (!_isMouseDown) return;
if (!_dataGridLoaded) return;
if (!IsVisible) return;
var header = (DataGridColumnHeader)sender;
var index = header.DisplayIndex - ViewModel.NumberOfHeaderColumns;
if (index < 0 || index >= FooterCells.Count) return;
FooterCells[index].Width = e.NewSize.Width;
}
//below referencing supporting properties:
private ScrollViewer _footerScroll;
private ScrollViewer FooterScrollViewer
{
get {
return _footerScroll ??
(_footerScroll = myDataGrid.FindVisualChildByName<ScrollViewer>("PART_Footer_ScrollViewer"));
}
}
//added this so I don't have to hunt them down from XAML every time
private List<Border> _footerCells;
private List<Border> FooterCells
{
get
{
if (_footerCells == null)
{
var ic = myDataGrid.FindVisualChildByName<ItemsControl>("PART_Footer");
_footerCells = new List<Border>();
for (var i = 0; i < ic.Items.Count; i++)
{
var container = ic.ItemContainerGenerator.ContainerFromIndex(i);
var border = ((Visual)container).FindVisualChild<Border>();
_footerCells.Add(border);
}
}
return _footerCells;
}
}
यह है कि के साथ सिंक डेटा ग्रिड स्क्रॉल! मुझे लगता है कि सबसे महत्वपूर्ण हिस्सा एक्सएएमएल है यह देखने के लिए कि आप अपनी "फ्रीजबल पंक्ति" कहां रख सकते हैं, बाकी सब कुछ, जैसे चीजों को जोड़ना/सिंक करना बहुत आसान है - लगभग एक लाइनर)
आपका मतलब कॉलम है? या आप कॉलम और पंक्ति 0 मतलब है? – RvdK
छुपा स्क्रॉलबार के साथ स्क्रॉलव्यू में ग्रिड व्यूहेडररॉव प्रस्तुतकर्ता को रखें। स्क्रॉलबार सक्षम दोनों के साथ आइटम्स प्रेजेंटर को दूसरे स्क्रॉल व्यू में रखें। – Dotnet
नहीं मेरा मतलब पंक्ति है।जब आप डेटाग्रिड को स्क्रॉल करते हैं तो आप पंक्ति 0 का दृश्य खो देंगे। लेकिन मैं हमेशा पंक्ति 0 को देखना चाहता हूं। इसलिए जब आप पंक्ति 360 पंक्ति 0 कहने के लिए स्क्रॉल करते हैं तो भी शीर्षलेख की तरह दिखाई देगा। उम्मीद है कि समझ में आता है। – user101010101