【问题标题】:Position a triangle along a slider沿滑块定位三角形
【发布时间】:2020-07-07 10:22:55
【问题描述】:

我想将滑块扩展一个指向固定位置的三角形(三角形不会像拇指一样移动)。

当前代码在位置 0,0 处绘制三角形。

<Path Data="M 0 0 L 6 0 L 3 7 Z" Stroke="Black" Fill="Black"/>

结果如下:

在本例中,滑块代表一个百分比值(范围不一定是 0 - 100)。三角形应该定位在一个固定的 % 值,这是通过依赖属性提供的。 我的问题是:如何重新定位三角形以指向该 % 值(而不是 thumbs 值)?

【问题讨论】:

  • 这很简单。创建一个具有以下宽度的三列网格:25*、0、75*,将三角形放在第二列的画布中以在 25% 的位置查看它。然后你可以编写一个转换器将 DP 值转换为GridLength 以在任何位置查看它
  • 但是转换会是什么样子?
  • return new GridLength((int)value, GridUnitType.Star) 我以为你知道如何写value converter
  • 对不起,我首先没有完全理解你的回答。谢谢你的帮助。但我最终做了不同的事情。
  • 很抱歉造成混乱,请看下面的答案。

标签: wpf path slider


【解决方案1】:

使用固定比率,它看起来像:

<Grid>
    <Grid Margin="0,-10,0,0">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="25*"/>
            <ColumnDefinition Width="0"/>
            <ColumnDefinition Width="75*"/>
        </Grid.ColumnDefinitions>
        <Canvas Grid.Column="1">
            <Path Data="M -3 0 L 3 0 L 0 7 Z" Stroke="Black" Fill="Black"/>
        </Canvas>
    </Grid>
    <Slider/>
</Grid>

请注意,我将路径更改为在画布上居中。

要使比率动态化,您需要一个能够将其绑定到属性的转换器(此处名为 Percentdouble

<Window.Resources>
    <local:GridLengthPercentConverter x:Key="GridLengthPercentConverter" />
</Window.Resources>
...
<Grid>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="{Binding 
                Path=Percent, 
                Converter={StaticResource GridLengthPercentConverter},
                ConverterParameter=first"/>
            <ColumnDefinition Width="0"/>
            <ColumnDefinition Width="{Binding 
                Path=Percent, 
                Converter={StaticResource GridLengthPercentConverter},
                ConverterParameter=other"/>
        </Grid.ColumnDefinitions>
        <Canvas Grid.Column="1">
            <Path Data="M -3 0 L 3 0 L 0 7 Z" Stroke="Black" Fill="Black"/>
        </Canvas>
    </Grid>
    <Slider/>
</Grid>

转换器的外观如下:

public class GridLengthPercentConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if(parameter.ToString() == "first")
            return new GridLength((double)value, GridUnitType.Star)
        return new GridLength(100 - (double)value, GridUnitType.Star)
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 2021-02-06
    • 2014-09-23
    • 1970-01-01
    相关资源
    最近更新 更多