Canlight中Silverlight中的动态剪切宽度

时间:2010-09-17 02:57:43

标签: silverlight xaml clipping

为什么会抛出错误,我该怎么办?我需要将剪切矩设置为动态。

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="42"/>
        <ColumnDefinition x:Name="ListBoxContainer" Width="*"/>
        <ColumnDefinition Width="42"/>
    </Grid.ColumnDefinitions>


    <Canvas>
        <Button x:Name="btnGalleryLeft" 
                Click="btnGalleryLeftClick" 
                Style="{StaticResource GalleryNavigationLeft}"
                Canvas.Left="7"
                Canvas.Top="50" />
    </Canvas>
    <Canvas Grid.Column="1" x:Name="ListboxWrapper">
        <Canvas.Clip>
            <RectangleGeometry>
                <RectangleGeometry.Rect>
                    <Rect X="0" Y="0" 
                          Width="{Binding ElementName=ListBoxContainer, Path=Width}"
                          Height="{Binding ElementName=ListBoxContainer, Path=Height}"/>
                </RectangleGeometry.Rect>
            </RectangleGeometry>
        </Canvas.Clip>
        <ListBox x:Name="ListBox1" 
                 Margin="15, 18, 15, 0"  
                 Style="{StaticResource GalleryListBoxStyle}" 
                 ItemsSource="{Binding DocItemCollection}" 
                 SelectionChanged="ListBox_SelectionChanged" 
                 MouseLeftButtonUp="ListBox_MouseLeftButtonUp" 
                 Canvas.Top="0"
                 Canvas.Left="0"
               />
    </Canvas>
    <Canvas Grid.Column="2">
        <Button x:Name="btnGalleryRight"                     
                Click="btnGalleryRightClick" 
                Style="{StaticResource GalleryNavigationRight}"
                Margin="0, 0, 7, 0"
                Canvas.Top="50" />         

3 个答案:

答案 0 :(得分:2)

您仍然可以使用RectangleGeometry作为剪辑区域。只需订阅Loaded事件,然后创建一个新的RectangleGeometry

void control_Loaded(object sender, RoutedEventArgs e)
        {
            LayoutRoot.DataContext = this;

            Rect rect = new Rect(0, 0, yourWidth, yourHeight);
            RectangleGeometry reo = new RectangleGeometry();
            reo.Rect = rect;
            this.canvas.Clip = reo;
        }

只是添加少量信息

  

此外,不透明度和剪辑属性设置由。处理   组成线程。但是,如果是不透明蒙版或非矩形   剪辑用于动画对象,这些操作将被传递   到UI线程。这意味着即使剪辑区域是a   矩形形状但使用PathGeometry操作   传递给UI线程。所以一定要经常使用   如果可能,用于剪切路径的RectangleGeometry。

答案 1 :(得分:1)

解决方案终于....经过多次诅咒和咒骂。如果只有一切像CSS一样直接(溢出血腥的隐藏属性)。

前端:

<Canvas Grid.Column="1" x:Name="ListboxWrapper" Background="Black">
            <ScrollViewer Background="Red" 
                          FlowDirection="LeftToRight" 
                          HorizontalScrollBarVisibility="Hidden" 
                          VerticalScrollBarVisibility="Hidden"
                          x:Name="ScrollViewerClipper">                
                <Canvas x:Name="CarouselContainer">
                    <gallery:ImageCarousel x:Name="carousel" />
                </Canvas>
            </ScrollViewer>

后端:

public GalleryPanel()
        {
            InitializeComponent();

            LayoutRoot.SizeChanged +=new SizeChangedEventHandler(LayoutRoot_SizeChanged);
        }

        private void LayoutRoot_SizeChanged(object s, SizeChangedEventArgs e)
        {
            ScrollViewerClipper.Width = ListboxWrapper.ActualWidth;
            ScrollViewerClipper.Height = ListboxWrapper.ActualHeight;
        }

答案 2 :(得分:0)

我认为你过度复杂了。绑定到ColumnDefinition的宽度/高度不起作用。我只是创建了可以订阅SizeChanged事件并根据ActualWidth [Height]设置剪辑的行为。