WPF:实现可扩展的自定义控件

时间:2014-08-28 14:01:53

标签: c# wpf xaml custom-controls

我正在研究ColorPicker控件,并决定最好用原始控件组合它,以便能够重新排列控件模板中的各种滑块和色轮,而无需重新定义所有内容。 (此外,控制代码会变得非常混乱)

我为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:为了使问题更具体,并希望减少“基于意见”,问题可以重新表述为:

有哪些选项可用于制作由各个部分和上述示例组成的控件,特别是可扩展的。

1 个答案:

答案 0 :(得分:-1)

最简单的方法是成为一个视图框。

http://wpftutorial.net/ViewBox.html