2014-08-28 90 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

回答