代码之家  ›  专栏  ›  技术社区  ›  Sonny Boy

如何在WPF中调整多边形的大小?

  •  2
  • Sonny Boy  · 技术社区  · 15 年前

    我正在开发我的第一个WPF应用程序,我正在测试一个自定义控件,它是一个圆圈,中间画了一个播放按钮。不过,我好像遇到了点麻烦。当我画我的播放按钮时,我似乎无法使它沿着圆圈调整大小。具体地说,当我将圆的大小调整为更宽或更高时,“播放按钮”多边形将保持相同的大小和相同的绝对位置。有没有关于设置XAML或代码以更正此问题的指针?

    现有XAML:

    <Window x:Class="WPFTest.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:WPFTest">
        <StackPanel>
            <StackPanel.Resources>
                <Style TargetType="my:GradientButton">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type my:GradientButton}">
                                <Grid>
                                    <Ellipse Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" Stroke="{TemplateBinding Foreground}" VerticalAlignment="Top" HorizontalAlignment="Left">
                                        <Ellipse.Fill>
                                            <LinearGradientBrush>
                                                <GradientStop Color="{TemplateBinding GradientStart}" Offset="0"></GradientStop>
                                                <GradientStop Color="{TemplateBinding GradientEnd}" Offset="1"></GradientStop>
                                            </LinearGradientBrush>
                                        </Ellipse.Fill>
                                    </Ellipse>
                                    <Polygon Points="{TemplateBinding PlayPoints}" Fill="{TemplateBinding Foreground}" />
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </StackPanel.Resources>
            <my:GradientButton Content="Button" Height="50" x:Name="gradientButton1" Width="50" GradientStart="#FFCCCCCC" GradientEnd="#FFAAAAAA" PlayPoints="18,12 35,25 18,38" />
        </StackPanel>
    </Window>
    

    public class GradientButton : Button
        {
            internal static DependencyProperty GradientStartProperty;
            internal static DependencyProperty GradientEndProperty;
            internal static DependencyProperty PlayPointsProperty;
    
            static GradientButton()
            {
                GradientStartProperty = DependencyProperty.Register("GradientStart", typeof(Color), typeof(GradientButton));
                GradientEndProperty = DependencyProperty.Register("GradientEnd", typeof(Color), typeof(GradientButton));
                PlayPointsProperty = DependencyProperty.Register("PlayPoints", typeof(PointCollection), typeof(GradientButton));
            }
    
            public Color GradientStart
            {
                get { return (Color)base.GetValue(GradientStartProperty); }
                set { SetValue(GradientStartProperty, value); }
            }
    
            public Color GradientEnd
            {
                get { return (Color)base.GetValue(GradientEndProperty); }
                set { SetValue(GradientEndProperty, value); }
            }
    
            public PointCollection PlayPoints
            {
                get
                {
                    //this is where I'm trying to make the resizing dynamic, but this property never seems to get hit when I put in a breakpoint?
                    PointCollection result = new PointCollection();
                    double top = this.Width / 2.778;
                    double left = this.Width / 4.167;
                    double middle = this.Height / 2.00;
                    double right = this.Width / 1.429;
                    double bottom = this.Height / 1.316;
    
                    result.Add(new Point(left, top));
                    result.Add(new Point(right, middle));
                    result.Add(new Point(left, bottom));
    
                    return result;
                }
                set { SetValue(PlayPointsProperty, value); }
            }
        }
    
    1 回复  |  直到 15 年前
        1
  •  11
  •   Wallstreet Programmer    15 年前

    您需要将多边形的“拉伸”属性设置为“均匀”