2017-03-08 4 views
1

Ich speichere Spaltenbreiten beim Beenden der Anwendung und stelle sie beim Start wieder her. Alles funktioniert gut, es sei denn Benutzer Doppelklick Header. Dies würde dazu führen, dass die Spaltenbreite double.NaN wird, was ich unter Flag für Autosizing verstehe. Dann habe ich Probleme.GridViewColumn Autosize funktioniert nur einmal

Bei der Untersuchung des Problems habe ich festgestellt, welche Einstellung Spaltenbreite NaN wird die automatische Größenänderung aktivieren, aber nur einmal. Hier

ist ein Repro:

<ListView x:Name="listView"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="A" Width="NaN" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

Dann fügen Sie zwei Schaltflächen mit folgenden Klick-Handler:

void button1_Click(object sender, RoutedEventArgs e) => listView.Items.Add("abcd"); 
void button2_Click(object sender, RoutedEventArgs e) => listView.Items.Add("ABCDEFGHIJKL"); 

Durch Klicken button1 erste wird Spalte autosize "abcd" zu passen. Klicken Sie dann auf nicht.

Warum? Gibt es eine Problemumgehung, um es immer automatisch zu skalieren oder um Benutzer mindestens zu deaktivieren, die Größenänderung (versucht this solution ohne Erfolg) zu deaktivieren?

+0

registrieren Ist 'Width = "Auto"' statt von 'NaN' nicht funktionieren? – TyCobb

+0

Dies verhindert, dass der Benutzer die Spaltengröße ändern kann: http://stackoverflow.com/questions/181956/prevent-user-from-resizing-columns-with-wpf-listview – mm8

+0

@TyCobb, 'GridLength.Auto' ist für 'Grid's [' ColumnDefinition.Width'] (https://msdn.microsoft.com/en-us/library/system.windows.controls.columndefinition.width (v = vs.110) .aspx). Hier ist 'GridViewColumn.Width' vom' doppelten' Typ. – Sinatr

Antwort

2

Sie müssen die Width der Spalte auf jedem Update zurückgesetzt:

void button2_Click(object sender, RoutedEventArgs e) 
{ 
    listView.Items.Add("ABCDEFGHIJKL"); 
    GridView gv = listView.View as GridView; 
    gv.Columns[0].Width = gv.Columns[0].ActualWidth; 
    gv.Columns[0].Width = double.NaN; 

} 

und doppelklicken Sie deaktivieren Ändern der Größe Sie das PreviewMouseLeftButtonDown Ereignis für die GridViewColumnHeader wie damit umgehen könnte:

<ListView x:Name="listView"> 
    <ListView.View> 
     <GridView> 
      <GridView.ColumnHeaderContainerStyle> 
       <Style TargetType="{x:Type GridViewColumnHeader}"> 
        <EventSetter Event="PreviewMouseLeftButtonDown" Handler="listView_PreviewMouseLeftButtonDown"/> 
       </Style> 
      </GridView.ColumnHeaderContainerStyle> 
      <GridViewColumn Header="A" Width="Auto" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

private void listView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) => 
    e.Handled = e.ClickCount == 2; 
+0

Scheint zu funktionieren. Das ist ein schmutziger Trick (den Wert auf die aktuelle tatsächliche Breite zu setzen und dann wieder auf "NaN"), das hätte ich nie gedacht. Deaktivieren funktioniert auch, zwei Antworten in einem, danke! – Sinatr

0

Dies ist ein well know Verhalten unser von der WPF GridView.

Eine generische Lösung für mehrere Spalten ist ein Event-Handler (mein persönlicher Vorschlag ist für SizeChanged)

<ListView x:Name="listView" SizeChanged="listView_SizeChanged"> 

zu tun, um das Update

private void listView_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    foreach (GridViewColumn c in ((GridView)listView.View).Columns) 
    { 
     if (double.IsNaN(c.Width)) 
     { 
      c.Width = c.ActualWidth; 
     } 
     c.Width = double.NaN; 
    } 
} 
+2

typisch absurd downvote: So garantieren sie bei SO Qualität der Antworten :-) –

+0

Eine interessante Idee, danke. – Sinatr