【问题标题】:Styling GridSplitter wpf C#样式化 GridSplitter wpf C#
【发布时间】:2020-11-07 05:31:49
【问题描述】:

我想设置我的 GridSplitter 的样式,例如在其上添加点(如在 http://msdn.microsoft.com/en-us/library/aa970265.aspx 上找到的)。

我还想在 mouseOver 上更改 gridsplitter 颜色,或应用 Aero 主题。

<Style x:Key="GridSplitterStyle1" TargetType="{x:Type GridSplitter}">
  <Setter Property="Background"
          Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
  <Setter Property="PreviewStyle">
    <Setter.Value>
      <Style>
        <Setter Property="Control.Template">
          <Setter.Value>
            <ControlTemplate>
              <Rectangle Fill="#80000000"/>
            </ControlTemplate>
          </Setter.Value>
        </Setter>
      </Style>
    </Setter.Value>
  </Setter>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type GridSplitter}">
        <Border Background="{TemplateBinding Background}"
                BorderBrush="{TemplateBinding BorderBrush}"
                BorderThickness="{TemplateBinding BorderThickness}"/>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

<!--Theme-->
<ResourceDictionary.MergedDictionaries>
  <ResourceDictionary 
   Source="/RibbonControlsLibrary;component/Themes/Office2007Blue.xaml" />
</ResourceDictionary.MergedDictionaries>

<GridSplitter x:Name="gridSplitterTreeNodes" Width="10"
              BorderThickness="1,0" Cursor="SizeWE"
              RenderTransformOrigin="-1.2,0.507" ShowsPreview="True" 
              Style="{DynamicResource GridSplitterStyle1}">
  <GridSplitter.Background>
    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
      <GradientStop Color="#FFE3EFFF" Offset="0"/>
      <GradientStop Color="#FFAFD2FF" Offset=".45"/>
    </LinearGradientBrush>
  </GridSplitter.Background>
</GridSplitter>

【问题讨论】:

  • 给你示例代码...不要发布整个代码,因为它太大了
  • 我真的不认为投反对票的人应该对此有所了解。他们只是因为缺乏知识而无法理解:p

标签: wpf wpf-controls styling templating gridsplitter


【解决方案1】:

主要是为了我自己将来的参考,这里有一个垂直的网格分割器,它有一个圆形的按钮(但对鼠标悬停没有正确的反应):

<GridSplitter Grid.Column="1" VerticalAlignment="Stretch" HorizontalAlignment="Center" Width="8">
    <GridSplitter.Template>
        <ControlTemplate TargetType="{x:Type GridSplitter}">
            <Grid>
                <Button Content="⁞" />
                <Rectangle Fill="#00FFFFFF" />
            </Grid>
        </ControlTemplate>
    </GridSplitter.Template>
</GridSplitter>

水平分割器可以只使用“····”作为按钮的内容。

【讨论】:

  • 这看起来简单又干净!
  • 谢谢。我最终使用“▌▌▌▌▌▌”作为水平分割器的内容,恕我直言,它看起来比“····”好一点。
【解决方案2】:
<GridSplitter x:Name="gridSplitterTreeNodes" Width="5" BorderThickness="1,0" 
     Cursor="SizeWE" RenderTransformOrigin="-1.2,0.507" ShowsPreview="True"
     Style="{DynamicResource GridSplitterStyle1}">
  <GridSplitter.Background>
    <ImageBrush ImageSource="Images\gripDots.png" TileMode="FlipXY" 
                Stretch="UniformToFill"/>
  </GridSplitter.Background>
</GridSplitter>

你也可以从 Msnd Microsoft 保存图片来达到同样的效果,More Info

【讨论】:

  • 不确定那个“图片”应该是什么......损坏的图像链接指向一个实际的 MSDN 页面。我知道这是一个旧答案,但请随时修复链接(使用 stack.imgur 上传器?)。
【解决方案3】:

在不丢失鼠标事件的情况下,将“抓手”按钮/图形添加到 GridSplitter 的另一种方法是在拆分器顶部使用一个简单的标签。

    <GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Stretch" Background="Gray"/>

    <Label Grid.Column="1" Content="⁞" Foreground="White" VerticalAlignment="Center" FontSize="26" FontWeight="Bold" IsHitTestVisible="False"/>

确保 GridSplitter 和 Label 在同一列中,并且在 Label 中设置 IsHitTestVisible=False。

【讨论】:

    【解决方案4】:

    对于不同类型的样式,您可以执行以下操作。

    产生一个很好的重叠样式。 Gridsplitter 将左右内容重叠。

    <Grid>
         <Grid.ColumnDefinitions>
             <ColumnDefinition Width="*"/>
             <ColumnDefinition Width="1"/>
             <ColumnDefinition Width="*"/>
         </Grid.ColumnDefinitions>
    
         <Border Grid.Column="0" Background="#777"/>
    
         <GridSplitter
             Grid.Column="1"
             HorizontalAlignment="Stretch" 
             ResizeDirection="Columns"
             ResizeBehavior="PreviousAndNext"
             Panel.ZIndex="2">
               <GridSplitter.Template>
    
                   <ControlTemplate TargetType="{x:Type GridSplitter}">
    
                       <Grid>
                            <Rectangle IsHitTestVisible="False" Fill="Black"/>
                            <Border
                               Background="White"
                               Width="25" Height="25" c 
                               CornerRadius="25" Margin="-13 0">
                               <Path Stroke="Black" StrokeThickness="0.5" Width="17" Height="7" Data="m 4.4549201,1048.4664 -4.33056515,1.9095 4.33056515,1.9094 0,-3.8189 z m 3.0901599,0 0,3.8189 4.330565,-1.9094 -4.330565,-1.9095 z m -3.2239449,0.2053 0,3.4083 -3.86518514,-1.7041 3.86518514,-1.7042 z m 3.3577349,0 3.865185,1.7042 -3.865185,1.7041 0,-3.4083 z" Stretch="Fill"/>
                            </Border>
                       </Grid>
    
                    </ControlTemplate>
    
                    </GridSplitter.Template>
    
         </GridSplitter>
    
         <Border Grid.Column="2" Background="#777"/>
    
    </Grid>
    

    Sample Output

    【讨论】:

      【解决方案5】:

      针对 Burton Radons 的回答,我个人更喜欢造型:

      <GridSplitter
        Width="8"
        HorizontalAlignment="Stretch"
        VerticalAlignment="Stretch">
      
        <GridSplitter.Template>
          <ControlTemplate TargetType="{x:Type GridSplitter}">
            <Grid>
              <TextBlock
                HorizontalAlignment="Center"
                VerticalAlignment="Center"
                Text="⁞" />
              <Rectangle Fill="#00FFFFFF" />
            </Grid>
          </ControlTemplate>
        </GridSplitter.Template>
      </GridSplitter>
      

      此实现在保持功能的同时产生相同的美学效果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多