2014-08-28 86 views
1

我正在使用ColorPicker控件,并决定最好将其组成原始控件,以便能够重新排列控件模板中的各种滑块和色轮,而无需重新定义所有内容。 (也控制代码将变得相当凌乱)WPF:实现可缩放的自定义控件

我已经创建了一个新的模板Slider控制,我希望它是可扩展的。目前,拇指的大小是固定的,中心“轨道”也是如此。使控制可扩展

<Style x:Key="ColorSlider" TargetType="{x:Type Slider}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Slider}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 
        <Grid> 
         <Rectangle Grid.Column="1" Width="80" Height="480" VerticalAlignment="Center" HorizontalAlignment="Center"> 
          <Rectangle.Fill> 
           <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" > 
            <GradientStop Color="White" Offset="0.0"/> 
            <GradientStop Color="Black" Offset="1.0"/> 
           </LinearGradientBrush> 
          </Rectangle.Fill> 
         </Rectangle> 

         <Track x:Name="PART_Track"> 
          <Track.Thumb> 
           <Thumb x:Name="ValueThumb"> 
            <Thumb.Style> 
             <Style TargetType="Thumb"> 
              <Setter Property="Template"> 
               <Setter.Value> 
                <ControlTemplate> 
                 <Canvas Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"> 
                  <Rectangle Width="100" Height="20" Fill="Transparent"/> 
                  <Polygon Points="0,0 0,20 10,10" Fill="Black" /> 
                  <Polygon Points="100,0 100,20 90,10" Fill="Black" /> 
                 </Canvas> 
                </ControlTemplate> 
               </Setter.Value> 
              </Setter> 
             </Style> 
            </Thumb.Style> 
           </Thumb> 
          </Track.Thumb> 
         </Track> 
        </Grid> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

ColorPicker Control

一种方法是使用一个Grid然而这却会导致混乱,以及因为拇指必须超过3列延伸,那么这将是很难得到拇指的权利比例。

是否有任何使控件可扩展的最佳实践?例如,Viewbox只会放大结果并可能降低视觉质量。有没有其他方法可以使用?

更新1:为了解决意见:这里是使用网格的例子:

<Style x:Key="ColorSlider" TargetType="{x:Type Slider}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Slider}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 
        <Grid> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="Auto" MinHeight="5" /> 
          <RowDefinition Height="*" /> 
          <RowDefinition Height="Auto" MinHeight="5" /> 
         </Grid.RowDefinitions> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="Auto" MinWidth="10" /> 
          <ColumnDefinition Width="*" /> 
          <ColumnDefinition Width="Auto" MinWidth="10" /> 
         </Grid.ColumnDefinitions> 

         <Rectangle Grid.Column="1" Grid.Row="1"> 
          <Rectangle.Fill> 
           <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" > 
            <GradientStop Color="White" Offset="0.0"/> 
            <GradientStop Color="Black" Offset="1.0"/> 
           </LinearGradientBrush> 
          </Rectangle.Fill> 
         </Rectangle> 

         <Track x:Name="PART_Track" Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="0" Grid.RowSpan="2"> 
          <Track.Thumb> 
           <Thumb x:Name="ValueThumb"> 
            <Thumb.Style> 
             <Style TargetType="Thumb"> 
              <Setter Property="Template"> 
               <Setter.Value> 
                <ControlTemplate> 
                 <Canvas Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"> 
                  <Rectangle Height="20" Fill="Transparent"/> 
                  <Polygon Points="0,0 0,20 10,10" Fill="Black" /> 
                  <Polygon Points="100,0 100,20 90,10" Fill="Black" /> 
                 </Canvas> 
                </ControlTemplate> 
               </Setter.Value> 
              </Setter> 
             </Style> 
            </Thumb.Style> 
           </Thumb> 
          </Track.Thumb> 
         </Track> 
        </Grid> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

然而,这仍然无法扩展拇指三角形还有一个视觉问题,对此我不知道它如何才能在XAML中解决。也就是说,拇指延伸到酒吧底部。

See the bug

更新2:为了使问题更具体,希望少“的意见为主”,这个问题可以重新到:

没有一个有提供了哪些选项,使一个组成控制上面的各个部分和示例尤其可扩展。

+0

装饰器可以是你的选择在这里。其次,viewbox可能不会降低质量,除非您拥有栅格内容。 – pushpraj 2014-08-28 14:05:04

+0

在希望控件增长的位置使用具有*大小的行和列的网格。为什么这个“杂乱”和“很难得到拇指的比例”? – 2014-08-28 14:06:38

+0

你的问题是这个网站的主题,因为它主要是基于意见:*许多好问题根据专家经验产生一定程度的意见,但对这个问题的回答往往几乎完全基于意见,而不是事实,参考,或具体的专业知识。*如果您不编辑它以减少意见,那么Stack Overflow社区将投票结束它。 – Sheridan 2014-08-28 14:22:52

回答