2012-04-10 11 views
2

Nach der Antwort auf eine ähnliche Frage here konnte ich die MinWidth auf der XAML-Seite festlegen.Wie gelten MinWidth für ListView-Spalten in WPF in Steuerelementvorlage?

Was ich tun möchte, ist dies in der Kontrollvorlage für alle GridViewColumns in allen ListViews zu erreichen.

Ist das möglich?

Update:

habe ich versucht, ein einfaches Stück Beispielcode unten, aber es funktioniert nicht:

<Window x:Class="WpfApplication4.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <Window.Resources> 
     <Style TargetType="{x:Type GridViewColumnHeader}" > 
      <Setter Property="MinWidth" Value="200" /> 
     </Style> 
    </Window.Resources> 

    <Grid Width="500"> 
     <Border BorderBrush="Black" BorderThickness="2" Margin="20"> 
      <ListView SelectionMode="Single"> 
       <ListView.View> 
        <GridView> 
         <GridViewColumn Header="Header 1" Width="Auto"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
            <TextBlock Text="Hello There"/> 
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
         </GridViewColumn> 
         <GridViewColumn Header="Header 2" Width="Auto" /> 
        </GridView> 
       </ListView.View> 
      </ListView> 
     </Border> 
    </Grid> 
</Window> 
+0

Gridviewcolumn haben nicht einmal eine MinWidth Eigenschaft. Sie können keine Eigenschaft in einer Stil- oder Steuerelementvorlage festlegen, die nicht vorhanden ist. Bitte posten Sie Ihr XAML für wie Sie eine MinWidth auf eine GridViewColumn festlegen. – Paparazzi

+0

In der Verknüpfung zeigt es die Verwendung des Thumb und die Handhabung des DragDelta-Ereignisses, um die MinWidth zu erreichen. Gibt es eine Möglichkeit, dies in einer Kontrollvorlage zu erreichen? – Elan

Antwort

3
<ListView> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock MinWidth="100"/> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
       ...more columns... 
      </GridView> 
     </ListView.View> 
    </ListView> 
+1

Die Frage ist ALLES nicht – Paparazzi

+0

hmm, dann glaube ich nicht, dass du ... –

+1

Ich war eigentlich auf der Suche nach einer solchen Lösung. Es funktioniert gut, wenn Sie es auf eine bestimmte Spalte anwenden müssen. Ich musste nur die Bindung an den Textblock hinzufügen. – Apostrofix

4
<Window.Resources> 
    <Style TargetType="{x:Type GridViewColumnHeader}" > 
     <Setter Property="MinWidth" Value="400" /> 
    </Style> 
</Window.Resources> 
+0

Ich habe das versucht, aber hat nicht funktioniert. Haben Sie nicht gesagt, dass GridViewColumn keine MinWidth hat? – Elan

+0

Lesen - GridViewColumnHeader - nicht GridViewColumn. Ich habe das getestet - es funktioniert. – Paparazzi

+0

Ich habe eine Probe gepostet, die nicht für mich funktioniert. Könntest du bitte sehen, ob es noch etwas gibt, das du tust, das ich nicht habe? – Elan

4

ich auch in diesem gestolpert. Um es zu lösen, musste ich zwei Dinge tun:

  1. Ändern Sie die ControlTemplate von ListView-Header.
  2. Behandeln Sie das DragDelta-Ereignis des Thumb in der ControlTemplate.

Der Header von ListView ist GridViewColumnHeader. Im Folgenden finden Sie eine vereinfachte Version von ControlTemplate von GridViewColumnHeader. Wie wir sehen können, verwendet es in einem Canvas einen Thumb, um den Zieh-/Größenänderungs-Effekt zu erzeugen.

PS: Um die komplette Gridviewcolumnheader Control erhalten Sie bitte How to grab WPF 4.0 control default templates?

<ControlTemplate TargetType="GridViewColumnHeader"> 
<Grid SnapsToDevicePixels="True"> 
    <Border BorderThickness="0,1,0,1" Name="HeaderBorder" ...> 
    <!-- omitted --> 
    </Border> 
    <Border BorderThickness="1,0,1,1" Name="HeaderHoverBorder" Margin="1,1,0,0" /> 
    <Border BorderThickness="1,1,1,0" Name="HeaderPressBorder" Margin="1,0,0,1" /> 
    <Canvas> 
     <Thumb Name="PART_HeaderGripper"> 
     <!-- omitted --> 
     </Thumb> 
    </Canvas> 
</Grid> 
<ControlTemplate.Triggers> 
<!-- omitted --> 
</ControlTemplate.Triggers> 

So Um die Größe von Gridviewcolumnheader beziehen zu begrenzen, müssen wir Thumb Drag Ereignisse (Drag, Dragdelta Haken , DragCompleted ... usw.).

Alles was wir brauchen, ist das DragDelta Ereignis, solange wir die MinSize innerhalb der DragDeltaEventHandler kennen.

Im Folgenden ist XAML mit Kommentar geändert.

  1. Bind Gridviewcolumnheader des MinWidth auf Leinwand von MinWidth:

    <Grid Width="500"> 
        <Border BorderBrush="Black" BorderThickness="2" Margin="20"> 
         <ListView SelectionMode="Single"> 
          <ListView.View> 
           <GridView>       
            <GridViewColumn Header="Header 1" Width="Auto"> 
             <!-- Apply a style targeting GridViewColumnHeader with MinWidth = 80 and a ControlTemplate --> 
             <GridViewColumn.HeaderContainerStyle> 
              <Style TargetType="{x:Type GridViewColumnHeader}"> 
               <Setter Property="MinWidth" Value="80" /> 
               <Setter Property="Control.Template" Value="{DynamicResource myGridViewColumnHeaderControlTemplate}" /> 
              </Style> 
             </GridViewColumn.HeaderContainerStyle>** 
            </GridViewColumn> 
            <GridViewColumn Header="Header 2" Width="Auto" /> 
           </GridView> 
          </ListView.View> 
         </ListView> 
        </Border> 
    </Grid> 
    

    Im myGridViewColumnHeaderControlTemplate einige XAML hinzuzufügen.

  2. Schließen Sie das DragDelta-Ereignis von Thumb an.
<ControlTemplate x:Key="TemplateGridViewColumnHeader" TargetType="GridViewColumnHeader"> 
    <!-- omitted --> 
    <Canvas MinWidth="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=MinWidth, Mode=OneTime}"> 
     <Thumb x:Name="PART_HeaderGripper" DragDelta="myGridViewColumnHeader_DragDelta"> 

Schließlich wird die myGridViewColumnHeader_DragDelta Funktion:

private void myGridViewColumnHeader_DragDelta(object sender, DragDeltaEventArgs e) 
    { 
     DependencyObject parent = sender as DependencyObject; 

     try 
     { 
      do 
      { 
       parent = VisualTreeHelper.GetParent(parent as DependencyObject); 
      } while (parent.GetType() != typeof(Canvas)); 

      Canvas canvas = parent as Canvas; 
      if (canvas.ActualWidth + e.HorizontalChange < canvas.MinWidth) 
      { 
       e.Handled = true; 
      } 
     } 
     catch 
     { 
     } 
    } 

Dies ist die einzige Art, wie ich Arbeit finden. Hoffe, es gibt einen einfacheren Weg.

+0

Wirklich funktioniert. Vielen Dank. –

3

Wenn Sie eine Gridviewcolumnheader verwenden Sie Größenänderungen umgehen können:

<GridView> 
    <GridViewColumn> 
     <GridViewColumnHeader Content="HeaderContent" SizeChanged="HandleColumnHeaderSizeChanged"/> 
    ... 

in Code:

private void HandleColumnHeaderSizeChanged(object sender, SizeChangedEventArgs sizeChangedEventArgs) 
    { 
     if (sizeChangedEventArgs.NewSize.Width <= 60) { 
      sizeChangedEventArgs.Handled = true; 
      ((GridViewColumnHeader) sender).Column.Width = 60; 
     } 
    } 
+0

Genau das brauche ich! Vielen Dank –

Verwandte Themen