2012-04-10 16 views
2

同様の質問hereの回答に続いて、XAMLページでMinWidthを設定することができました。コントロールテンプレートのWPFでListView列にMinWidthを適用する方法はありますか?

私がしたいのは、すべてのListViewのすべてのGridViewColumnのコントロールテンプレートでこれを行うことです。

これは可能ですか?

更新:

私は、以下のサンプルコードの単純なビットを試してみましたが、それは動作しません:

<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でものminWidthプロパティがありません。存在しないスタイルまたはコントロールテンプレートでプロパティを設定することはできません。 GridViewColumnにMinWidthを設定する方法については、XAMLを投稿してください。 – Paparazzi

+0

このリンクでは、Thumbを使用し、DragDeltaイベントを処理してMinWidthを実行する方法を示します。コントロールテンプレートでこれを達成する方法はありますか? – Elan

答えて

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

質問はすべてではありません – Paparazzi

+0

うん、私はあなたができるとは思わない... –

+1

私は実際にそのような解決策を探していました。特定の列に適用する必要がある場合に効果的です。私は、テキストブロックにバインディングを追加するだけでした。 – Apostrofix

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

私はこれを試しましたが、うまくいきませんでした。 GridViewColumnにMinWidthがないと言っていませんか? – Elan

+0

読み取り - GridViewColumnHeader - GridViewColumnではありません。私はこれをテストしました。 – Paparazzi

+0

サンプルを投稿しましたが、これは私のためには機能しません。私が持っていない何か他に何かがあるかどうか見てください。 – Elan

4

私もこの一つにつまずきました。それを解決するには、私は2つのことをしなければなりませんでした。

  1. ListViewのヘッダーのControlTemplateを変更します。
  2. ControlTemplate内のThumbのDragDeltaイベントを処理します。

ListViewのヘッダーはGridViewColumnHeaderです。 以下はGridViewColumnHeaderのControlTemplateの簡略版です。ご覧のとおり、CanvasでThumbを使用してドラッグ/サイズ変更エフェクトを作成します。

PS:完全GridViewColumnHeaderのControlTemplateを得られるようGridViewColumnHeaderの大きさを制限するために、我々は親指のドラッグイベント(DragStarted、DragDeltaをフックする必要が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> 

を参照してください。 、DragCompleted ...など)。

DragDeltaEventHandler内のMinSizeを知る限り、DragDeltaイベントが必要です。

以下は、XAMLを修正したものです。 myGridViewColumnHeaderControlTemplateで

<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> 

にいくつかのXAMLを追加:キャンバスののminWidthに

  1. バインドGridViewColumnHeaderさんのminWidth。
  2. ThumbのDragDeltaイベントをフックします。
<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"> 

最後にmyGridViewColumnHeader_DragDelta機能:

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 
     { 
     } 
    } 

これは私が働いて見つける唯一の方法です。簡単な方法があることを願ってください。コード内

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

:あなたは、サイズ変更を処理することができGridViewColumnHeaderを使用する場合は

+0

実際に動作します。ありがとうございました。 –

3

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

これは私が必要とするものです!どうもありがとうございました –

関連する問題