Динамическое определение пути в Silverlight 2

У меня есть граница с закругленными углами на холсте, и я хочу добавить на холст область отсечения, чтобы все, что я добавляю, обрезалось до области внутри границы. Я знаю, что могу установить свойство Clip холста, но поскольку размер холста и объекта определяется динамически, а не в XAML, я не могу понять, как вычислить путь для использования. Есть ли способ получить PathGeometry из UIElement (в данном случае границы)? Если нет, то как лучше всего подойти к этому? Вот 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>


person Steve Crane    schedule 26.03.2009    source источник


Ответы (3)


Попробуйте использовать ActualHeight и ActualWidth свойства

var height = TimelineCanvas.ActualHeight;
var width = TimelineCanvas.ActualWidth;
person bendewey    schedule 26.03.2009
comment
Я думал об их использовании, но мне было интересно, может ли быть какой-то другой, более умный способ сделать это. - person Steve Crane; 26.03.2009

В итоге я использовал этот код, но все равно был бы заинтересован в любых альтернативных методах.

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;
person Steve Crane    schedule 26.03.2009
comment
Я должен был бы одобрить этот метод; хотя бы потому, что я делал это десятки раз, не видя лучшего подхода. - person MojoFilter; 26.03.2009

Попробуйте blacklight

Пакет инструментов Blacklight имеет инструмент обрезки закругленных углов и является бесплатным.

person Zone12    schedule 01.04.2009