【问题标题】:Avalonia OpacityMask with GeometryDrawing带有 GeometryDrawing 的 Avalonia OpacityMask
【发布时间】:2022-06-13 01:48:15
【问题描述】:

我正在尝试从 WPF 转换此代码,但不支持 DrawingBrush。在 Avalonia 中是否有等效的编写方式?

<Grid.OpacityMask>
    <DrawingBrush>
        <DrawingBrush.Drawing>
            <GeometryDrawing Brush="Black" Geometry="{StaticResource Triangle}" />
        </DrawingBrush.Drawing>
    </DrawingBrush>
</Grid.OpacityMask>

这是我能得到的最接近的。它编译并运行,但似乎没有做我想做的事

<Grid.OpacityMask>
    <VisualBrush>
        <VisualBrush.Visual>
            <ContentControl>
                <GeometryDrawing Brush="Black" Geometry="{StaticResource VolumeTriangle}" />
            </ContentControl>
        </VisualBrush.Visual>
    </VisualBrush>
</Grid.OpacityMask>

编辑:这是我需要应用样式的 Slider 模板

<Style Selector="local|MediaPlayer Slider.volume">
MediaPlayerVolumeBackgroundBrush}" /> -->
    <Setter Property="Focusable" Value="False" />
    <Setter Property="Template">
        <ControlTemplate>
            <Grid>
                <Grid>
                    <Track Name="PART_Track" Value="{TemplateBinding Value}" Orientation="Horizontal">
                        <Track.Thumb>
                            <Thumb Width="5" Height="15" Background="{TemplateBinding Background}">
                                <Thumb.Template>
                                    <ControlTemplate>
                                        <Border Background="Black" />
                                    </ControlTemplate>
                                </Thumb.Template>
                            </Thumb>
                        </Track.Thumb>
                        <Track.DecreaseButton>
                            <RepeatButton.Template>
                                <ControlTemplate>
                                    <Path Data="{TemplateBinding ., Converter={StaticResource TimeSpanToDoubleConverter}, ConverterParameter={TemplateBinding Value}, Mode=OneWay}" Stretch="Fill"
                                          Stroke="{DynamicResource MediaPlayerVolumeBorderBrush}" StrokeThickness="1" />
                                </ControlTemplate>
                            </RepeatButton.Template>
                        </Track.DecreaseButton>
                        <Track.IncreaseButton>
                            <RepeatButton Name="PART_IncreaseButton"
                                          Height="{TemplateBinding Height}" Width="{TemplateBinding Width}" Padding="0"
                                          Background="LightGray" />
                        </Track.IncreaseButton>
                    </Track>
                </Grid>
            </Grid>
        </ControlTemplate>
    </Setter>
</Style>

【问题讨论】:

    标签: c# .net .net-core avaloniaui


    【解决方案1】:

    您可以使用IValueConverter 来计算路径数据,只需将边界和值作为参数传递。

    下面的示例没有考虑价值,但扩展这应该不是一个大问题。

    public class BoundsToPathDataConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var bounds = (Rect)value;
    
            return new PathGeometry()
            {
                Figures = new PathFigures()
                {
                    new PathFigure()
                    {
                        StartPoint = new Point(),
                        Segments = new PathSegments()
                        {
                            new LineSegment() { Point = new Point(0, bounds.Height) },
                            new LineSegment() { Point = new Point(bounds.Width, bounds.Height) },
                            new LineSegment() { Point = new Point(bounds.Width, 0) },
                            new LineSegment() { Point = new Point(0,bounds.Height - 4) },
                        }
                    }
                }
            };
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }
    

    结果:

    【讨论】:

      猜你喜欢
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 2018-01-30
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 2015-05-07
      相关资源
      最近更新 更多