2012-05-05 4 views
0

내가 데이터 그리드가 : 거기에 기본 템플릿에서DataGrid의 ScrollViewer 내부에 내용을 추가하는 방법은 무엇입니까?

<DataGrid ...></DataGrid> 

어딘가에을하는 ScrollViewer있다. 그 안에 내용을 추가하고 싶습니다. 현재 내가이 일을하고있다 : 다음과 같습니다

<Grid> 
    <DataGrid Grid.Row="0">...</DataGrid> 

    <Canvas Width="128" VerticalAlignment="Stretch" HorizontalAlignment="Left" Grid.Row="0" Margin="0,25,0,0"> 
     <Rectangle Width="32" Height="256" Canvas.Top="0" Canvas.Left="0" Stroke="Black" StrokeThickness="2" /> 
    </Canvas> 
</Grid> 

을 :

입니다

enter image description here

는 캔버스 그리드 내부에 그려진됩니다. 이것은 모두 훌륭하지만 캔버스는 데이터 그리드와 함께 스크롤하지 않습니다. 나는 내부의 캔버스를 배치하려면 어떻게

A first chance exception of type 'System.InvalidOperationException' occurred in PresentationFramework.dll

Additional information: Items collection must be empty before using ItemsSource.

:

<DataGrid> 
    <ControlTemplate> 
     <ScrollViewer> 
      <Grid> 
       <ContentPresenter Grid.Row="0" /> 

       <Canvas Width="128" VerticalAlignment="Stretch" HorizontalAlignment="Left" Grid.Row="0" Margin="0,25,0,0"> 
        <Rectangle Width="32" Height="256" Canvas.Top="0" Canvas.Left="0" Stroke="Black" StrokeThickness="2" /> 
       </Canvas> 
      </Grid> 
     </ScrollViewer> 
    </ControlTemplate> 
</DataGrid> 

그러나이 나에게 오류를주고있다 : 지금은 아마 컨트롤 템플릿을 변경하고 스크롤 뷰어 내에서 캔버스를 둘 필요가 실현 스크롤러로 내용과 함께 스크롤하게 만드시겠습니까?

답변

2

DataGrid는 ItemsControl이고 ItemsControl의 ContentProperty는 Items 속성입니다. Items 속성에 적용됩니다 - 그 내용입니다 - 그럼 <SomethingHere>

<DataGrid> 
    <SomethingHere> 
</DataGrid> 

:

[DefaultEvent("OnItemsChanged"), DefaultProperty("Items")] 
[ContentProperty("Items")] 
[StyleTypedProperty(Property = "ItemContainerStyle", StyleTargetType = typeof(FrameworkElement))] 
[Localizability(LocalizationCategory.None, Readability = Readability.Unreadable)] // cannot be read & localized as string 
public class ItemsControl : Control, IAddChild, IGeneratorHost 
{ 

이것은 당신이 뭔가를 할 경우 의미합니다 : 여기에 디 컴파일 소스의의 ContentProperty 속성을 알 . 나중에 ItemsSource 속성에 바인딩하면 "ItemsSource를 사용하기 전에 항목 컬렉션이 비어 있어야합니다."라는 오류가 표시됩니다. 당신은 당신이 오류를 얻을 수 없겠죠

<DataGrid> 
    <DataGrid.Template> 
     <ControlTemplate> ... 

을 사용했다면

.

어떤 경우 든 블렌드 또는 VS11을 사용하여 DataGrid의 전체 ControlTemplate을 추출하고이를 수정하는 것이 좋습니다 (예 :

<Style x:Key="{ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}" TargetType="{x:Type Button}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Button}"> 
        <Grid> 
         <Rectangle x:Name="Border" Fill="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" SnapsToDevicePixels="True"/> 
         <Polygon x:Name="Arrow" Fill="Black" HorizontalAlignment="Right" Margin="8,8,3,3" Opacity="0.15" Points="0,10 10,10 10,0" Stretch="Uniform" VerticalAlignment="Bottom"/> 
        </Grid> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter Property="Stroke" TargetName="Border" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}"/> 
         </Trigger> 
         <Trigger Property="IsPressed" Value="True"> 
          <Setter Property="Fill" TargetName="Border" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}"/> 
         </Trigger> 
         <Trigger Property="IsEnabled" Value="False"> 
          <Setter Property="Visibility" TargetName="Arrow" Value="Collapsed"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
    <Style x:Key="DataGridStyle1" TargetType="{x:Type DataGrid}"> 
     <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
     <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
     <Setter Property="BorderBrush" Value="#FF688CAF"/> 
     <Setter Property="BorderThickness" Value="1"/> 
     <Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected"/> 
     <Setter Property="ScrollViewer.CanContentScroll" Value="true"/> 
     <Setter Property="ScrollViewer.PanningMode" Value="Both"/> 
     <Setter Property="Stylus.IsFlicksEnabled" Value="False"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type DataGrid}"> 
        <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True"> 
         <ScrollViewer x:Name="DG_ScrollViewer" Focusable="false"> 
          <ScrollViewer.Template> 
           <ControlTemplate TargetType="{x:Type ScrollViewer}"> 
            <Grid> 
             <Grid.ColumnDefinitions> 
              <ColumnDefinition Width="Auto"/> 
              <ColumnDefinition Width="*"/> 
              <ColumnDefinition Width="Auto"/> 
             </Grid.ColumnDefinitions> 
             <Grid.RowDefinitions> 
              <RowDefinition Height="Auto"/> 
              <RowDefinition Height="*"/> 
              <RowDefinition Height="Auto"/> 
             </Grid.RowDefinitions> 
             <Button Command="{x:Static DataGrid.SelectAllCommand}" Focusable="false" Style="{DynamicResource {ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}}" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.All}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Width="{Binding CellsPanelHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/> 
             <DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter" Grid.Column="1" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/> 
             <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" CanContentScroll="{TemplateBinding CanContentScroll}" Grid.ColumnSpan="2" Grid.Row="1"/> 
             <ScrollBar x:Name="PART_VerticalScrollBar" Grid.Column="2" Maximum="{TemplateBinding ScrollableHeight}" Orientation="Vertical" Grid.Row="1" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportHeight}"/> 
             <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> 
            </Grid> 
           </ControlTemplate> 
          </ScrollViewer.Template> 
          <Grid> 
           <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 

           <!-- your canvas here --> 
           <Canvas Width="128" VerticalAlignment="Stretch" HorizontalAlignment="Left" Grid.Row="0" Margin="0,25,0,0"> 
            <Rectangle Width="32" Height="256" Canvas.Top="0" Canvas.Left="0" Stroke="Black" StrokeThickness="2" /> 
           </Canvas> 
          </Grid> 
         </ScrollViewer> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <Trigger Property="IsGrouping" Value="true"> 
       <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<Grid> 
    <DataGrid HorizontalAlignment="Left" Margin="125,110,0,0" VerticalAlignment="Top" Height="134" Width="258" Style="{DynamicResource DataGridStyle1}"/> 

</Grid> 
+0

Visual Studio 2011을 사용하여 기본 템플릿을 어떻게 추출 했습니까? – Tower

+0

@rFactor : 예 VS11. – Phil

+0

내 말은 * 어떻게 * 정확히 * 당신이 그것을 했습니까? – Tower

관련 문제