2011-02-04 3 views
2

어떻게 내가 중심이 아닌 위치를 왼쪽 기본값으로 그룹 상자 헤더를 정렬 할 수 있습니다. WPF 그룹 상자 헤더 정렬 문제는

나는 하나의 템플릿을 사용할 수있는 많은 게시물을 읽을하지만 난 그런 일에 대해 아무 생각이 없습니다. 제게 머리글을 어떻게 가져올 수 있는지 알려주세요.

감사합니다.

답변

4

예, 당신은 템플릿을 수정해야합니다. 센터 - 정렬를 들어


마우스 오른쪽 정렬센터 - 정렬 여기 마우스 오른쪽 정렬 모두를 포함하는 샘플 프로젝트 업로드 미 히어 Gokani

에 의해 this answer를 참조 토마스 레베에 의해 this answer 참조 : http://www.mediafire.com/?hd2vbwr97ep7yis

토마스와 동일한 접근 방식을 사용하는 중앙 정렬

가능한이

<GroupBox Header="Centered Header" 
      Style="{StaticResource CenteredHeaderGroupBoxStyle}" 
      .../> 

CenteredHeaderGroupBoxStyle

<local:CenterBorderGapMaskConverter x:Key="CenterBorderGapMaskConverter"/> 
<Style x:Key="CenteredHeaderGroupBoxStyle" TargetType="{x:Type GroupBox}"> 
    <Setter Property="BorderBrush" Value="#D5DFE5"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type GroupBox}"> 
       <Grid SnapsToDevicePixels="true"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="6"/> 
         <ColumnDefinition Width="Auto"/> 
         <ColumnDefinition Width="*"/> 
         <ColumnDefinition Width="6"/> 
        </Grid.ColumnDefinitions> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto"/> 
         <RowDefinition Height="Auto"/> 
         <RowDefinition Height="*"/> 
         <RowDefinition Height="6"/> 
        </Grid.RowDefinitions> 
        <Border BorderBrush="Transparent" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.ColumnSpan="4" Grid.Column="0" CornerRadius="4" Grid.Row="1" Grid.RowSpan="3"/> 
        <Border Grid.ZIndex="2" x:Name="Header" Grid.Column="2" HorizontalAlignment="Center" Padding="3,1,3,0" Grid.Row="0" Grid.RowSpan="2"> 
         <ContentPresenter ContentSource="Header" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
        </Border> 
        <ContentPresenter Grid.ColumnSpan="2" Grid.Column="1" Margin="{TemplateBinding Padding}" Grid.Row="2" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
        <Border RenderTransformOrigin="0.5,0.5" BorderBrush="White" BorderThickness="{TemplateBinding BorderThickness}" Grid.ColumnSpan="4" CornerRadius="4" Grid.Row="1" Grid.RowSpan="3"> 
         <Border.OpacityMask> 
          <MultiBinding ConverterParameter="7" Converter="{StaticResource CenterBorderGapMaskConverter}"> 
           <Binding ElementName="Header" Path="ActualWidth"/> 
           <Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}"/> 
           <Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}"/> 
          </MultiBinding> 
         </Border.OpacityMask> 
         <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3"> 
          <Border BorderBrush="White" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2"/> 
         </Border> 
        </Border> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

CenterBorderGapMaskConverter

class CenterBorderGapMaskConverter : IMultiValueConverter 
{ 
    // Methods 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     Type type = typeof(double); 
     if (values == null 
      || values.Length != 3 
      || values[0] == null 
      || values[1] == null 
      || values[2] == null 
      || !type.IsAssignableFrom(values[0].GetType()) 
      || !type.IsAssignableFrom(values[1].GetType()) 
      || !type.IsAssignableFrom(values[2].GetType())) 
     { 
      return DependencyProperty.UnsetValue; 
     } 

     double pixels = (double)values[0]; 
     double width = (double)values[1]; 
     double height = (double)values[2]; 
     if ((width == 0.0) || (height == 0.0)) 
     { 
      return null; 
     } 
     Grid visual = new Grid(); 
     visual.Width = width; 
     visual.Height = height; 
     ColumnDefinition colDefinition1 = new ColumnDefinition(); 
     ColumnDefinition colDefinition2 = new ColumnDefinition(); 
     ColumnDefinition colDefinition3 = new ColumnDefinition(); 
     colDefinition1.Width = new GridLength(1.0, GridUnitType.Star); 
     colDefinition2.Width = new GridLength(pixels); 
     colDefinition3.Width = new GridLength(1.0, GridUnitType.Star); 
     visual.ColumnDefinitions.Add(colDefinition1); 
     visual.ColumnDefinitions.Add(colDefinition2); 
     visual.ColumnDefinitions.Add(colDefinition3); 
     RowDefinition rowDefinition1 = new RowDefinition(); 
     RowDefinition rowDefinition2 = new RowDefinition(); 
     rowDefinition1.Height = new GridLength(height/2.0); 
     rowDefinition2.Height = new GridLength(1.0, GridUnitType.Star); 
     visual.RowDefinitions.Add(rowDefinition1); 
     visual.RowDefinitions.Add(rowDefinition2); 
     Rectangle rectangle1 = new Rectangle(); 
     Rectangle rectangle2 = new Rectangle(); 
     Rectangle rectangle3 = new Rectangle(); 
     rectangle1.Fill = Brushes.Black; 
     rectangle2.Fill = Brushes.Black; 
     rectangle3.Fill = Brushes.Black; 
     Grid.SetRowSpan(rectangle1, 2); 
     Grid.SetRow(rectangle1, 0); 
     Grid.SetColumn(rectangle1, 0); 
     Grid.SetRow(rectangle2, 1); 
     Grid.SetColumn(rectangle2, 1); 
     Grid.SetRowSpan(rectangle3, 2); 
     Grid.SetRow(rectangle3, 0); 
     Grid.SetColumn(rectangle3, 2); 
     visual.Children.Add(rectangle1); 
     visual.Children.Add(rectangle2); 
     visual.Children.Add(rectangle3); 
     return new VisualBrush(visual); 
    } 
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     return new object[] { Binding.DoNothing }; 
    } 
} 
+1

당신이 솔루션은 나를 위해 나를 완벽하게 일을 같이 .. ... 너무 너무 많이하지만 난 나를 귀찮게하지 않는 몇 가지 차이를 발견하지만 난 당신과 함께 공유해야한다고 생각 감사합니다. 일반 GropuBox에서 그리드를 삽입 할 때 그리드는 그룹 박스 내부에 약간의 여백이 있습니다. 이 경우 (groupBox 상자), 격자는 머리글과 정확히 같은 위치에서 시작됩니다. 샘플의 각 그룹 상자에 눈금을 삽입하면 내가 말하는 것에 대해 이해할 수 있습니다. 이 나는 ​​패딩이나 마진 뭔가를 할 것 같아요. 다시 한 번 .... 코드에서 감사 톤을 확인할 것! –

+0

@ Pankaj Upadhyay : 당신 말이 맞아, 그게 실제로 이상 하네. ** Expression Blend 4 **가 아닌 ** Visual Studio 2010 ** 디자이너에서만 발생하며 ** Blend **에서 만든 기본 템플릿을 사용할 때 발생합니다. 나는 그것을 들여다 볼 것이다. 좋은 관찰! –

+0

@Pankaj Upadhyay : 템플릿에서 아무 것도 잘못 보이지 않아 ** VS2010 ** 디자이너의 버그 일 수도 있고, 아마도 무언가를 놓치고있는 것일 수도 있습니다. –