【问题标题】:Determine path dynamically in Silverlight 2在 Silverlight 2 中动态确定路径
【发布时间】:2010-10-15 18:01:46
【问题描述】:

我在画布中有一个带圆角的边框,我想在画布上添加一个剪切区域,以便我添加的任何内容都被剪切到边框内的区域。我知道我可以设置画布的 Clip 属性,但是由于画布和对象是动态调整大小的,而不是在 XAML 中分配大小,我不知道如何计算要使用的路径。有什么方法可以从 UIElement (在这种情况下为边框)派生 PathGeometry 吗?如果不是,解决此问题的最佳方法是什么?这是我正在使用的测试页面的 XAML。

<UserControl x:Class="TimelinePrototype.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid x:Name="LayoutRoot">
    <Grid.RowDefinitions>
        <RowDefinition Height="auto" />
        <RowDefinition />
    </Grid.RowDefinitions>
    <StackPanel Orientation="Horizontal" Margin="10">
        <Button x:Name="cmdDraw" FontSize="18" Click="cmdDraw_Click" Content="Draw" Margin="0,0,5,0" VerticalAlignment="Bottom" />
        <TextBlock x:Name="txtDateRange" FontSize="18" Margin="10,0,10,10" VerticalAlignment="Bottom" />
    </StackPanel>
    <Canvas x:Name="TimelineCanvas" Grid.Row="1" HorizontalAlignment="Stretch" 
                SizeChanged="TimelineCanvas_SizeChanged">
        <Border x:Name="TimelineBorder" 
                Background="LightGray" 
                BorderBrush="Black" 
                BorderThickness="2" 
                CornerRadius="15" 
                Margin="10"
                Grid.Row="1"
                VerticalAlignment="Top">
        </Border>
    </Canvas>
</Grid>

【问题讨论】:

    标签: path silverlight-2.0 clipping pathgeometry


    【解决方案1】:

    尝试使用ActualHeightActualWidth 属性

    var height = TimelineCanvas.ActualHeight;
    var width = TimelineCanvas.ActualWidth;
    

    【讨论】:

    • 我曾想过使用这些,但想知道是否有其他更聪明的方法。
    【解决方案2】:

    我最终使用了这段代码,但仍然对任何替代方法感兴趣。

    RectangleGeometry clipRect = new RectangleGeometry();
    clipRect.Rect = new Rect(TimelineBorder.Margin.Left, TimelineBorder.Margin.Top, TimelineCanvas.ActualWidth - (TimelineBorder.Margin.Left + TimelineBorder.Margin.Right), TimelineCanvas.ActualHeight - (TimelineBorder.Margin.Top + TimelineBorder.Margin.Bottom));
    clipRect.RadiusX = TimelineBorder.CornerRadius.TopLeft;
    clipRect.RadiusY = TimelineBorder.CornerRadius.TopLeft;
    TimelineCanvas.Clip = clipRect;
    

    【讨论】:

    • 我必须支持这种方法;如果只是因为我已经这样做了几十次,却没有看到更好的方法。
    【解决方案3】:

    试试blacklight

    blacklight 工具包有一个圆角剪裁工具,而且是免费的。

    【讨论】:

      猜你喜欢
      • 2011-04-07
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-12
      • 1970-01-01
      • 2010-10-20
      • 2011-10-04
      相关资源
      最近更新 更多