मैं वापस थोड़ी देर के लिए कि समस्या थी और मैं तो यह से नाराज है कि मैं इसके लिए एक बदसूरत ठीक कर दिया हो रही थी। यह बहुत नहीं है, लेकिन यह हो जाता है काम किया। सबसे पहले, टी उनकी केवल एक समस्या है जब क्षैतिज स्क्रॉलबार अदृश्य है इसलिए हमें इसके संदर्भ की आवश्यकता होगी। इस कोड को एक बार सभी DataGridColumns लोड हो जाने पर चलाने के लिए होगा (मेरे मामले में, सभी Xaml में है, इसलिए लोडेड घटना) और इसे जोड़ने/ध्यान में DataGridColumns के हटाने के ले नहीं करता, लेकिन यह है कि एक आसान ठीक है।
<DataGrid Name="c_dataGrid"
Loaded="c_dataGrid_Loaded"
...>
<DataGrid.Columns>
<DataGridTextColumn ..."/>
<DataGridTextColumn ..."/>
<!-- ... -->
फिर लोडेड eventhandler में हम डेटा ग्रिड ScrollViewer हो और डेटा ग्रिड में हर DataGridColumn की ActualWidthProperty में परिवर्तन के लिए एक श्रोता जोड़ें।
private ScrollViewer m_dataGridScrollViewer = null;
private void c_dataGrid_Loaded(object sender, RoutedEventArgs e)
{
m_dataGridScrollViewer = GetVisualChild<ScrollViewer>(c_dataGrid);
DependencyPropertyDescriptor dependencyPropertyDescriptor =
DependencyPropertyDescriptor.FromProperty(DataGridColumn.ActualWidthProperty, typeof(DataGridColumn));
if (dependencyPropertyDescriptor != null)
{
foreach (DataGridColumn column in c_dataGrid.Columns)
{
dependencyPropertyDescriptor.AddValueChanged(column, DataGridColumn_ActualWidthChanged);
}
}
}
और फिर हम सब DataGridColumns के आकार से डेटा ग्रिड के आकार की गणना और 8.0 की एक निरंतर जोड़ने (जो अंतर आम तौर पर होता है)।
private void DataGridColumn_ActualWidthChanged(object sender, EventArgs e)
{
if (m_dataGridScrollViewer != null)
{
if (m_dataGridScrollViewer.ComputedHorizontalScrollBarVisibility != Visibility.Visible)
{
double dataGridWidth = 8.0;
foreach (DataGridColumn column in c_dataGrid.Columns)
{
dataGridWidth += column.ActualWidth;
}
c_dataGrid.Width = dataGridWidth;
}
else
{
c_dataGrid.Width = double.NaN;
}
}
}
आप ऐसा करने का एक बेहतर तरीका है के साथ आते हैं तो मुझे पता है :)
public static T GetVisualChild<T>(object parent) where T : Visual
{
DependencyObject dependencyObject = parent as DependencyObject;
return InternalGetVisualChild<T>(dependencyObject);
}
private static T InternalGetVisualChild<T>(DependencyObject parent) where T : Visual
{
T child = default(T);
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
child = v as T;
if (child == null)
{
child = GetVisualChild<T>(v);
}
if (child != null)
{
break;
}
}
return child;
}
स्रोत
2010-11-15 22:19:14
यह एक अच्छा समाधान है। मैंने इसे थोड़ा tweaked किया है ताकि यह इसके बजाय मैक्सविड्थ संपत्ति सेट करता है। यह दृश्य अभिभावक की बाधाओं से परे ग्रिड की समस्या का विस्तार करता है। मैंने इसे बेहतर तरीके से encapsulate करने के लिए इसे एक व्यवहार में भी परिवर्तित कर दिया। – jjrdk
इसके अलावा, यदि DataGridColumn_ActualWidthChanged को नहीं कहा जा रहा है, तो सुनिश्चित करें कि आप Microsoft.Windows.Controls.DataGridColumn का उपयोग करें, न कि System.Windows.Controls.DataGridColumn जब आप निर्भरताप्रॉपर्टी डिस्क्रिप्टर प्राप्त कर रहे हों। – Monsignor