Динамическая ширина отсечения в Silverlight в Canvas - PullRequest
2 голосов
/ 17 сентября 2010

Почему это приводит к ошибке и как я могу исправить ... Мне нужно установить прямоугольник отсечения, чтобы быть динамическим.

    <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 ]

2 голосов
/ 13 декабря 2012

Вы все еще можете использовать 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;
        }

Просто добавьте немного информации

Кроме того, настройки свойств непрозрачности и клипобрабатывается потоком композиции.Однако если на анимированном объекте используется маска непрозрачности или непрямоугольный клип, эти операции будут переданы в поток пользовательского интерфейса.Это означает, что даже если область клипа имеет прямоугольную форму, но использует PathGeometry, операции будут переданы в поток пользовательского интерфейса.Поэтому всегда используйте RectangleGeometry для обтравочных контуров, если это возможно.

1 голос
/ 17 сентября 2010

Решение наконец-то .... после долгих ругательств и ругательств. Если бы все было так же просто, как в 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>

Back-конец:

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;
        }
0 голосов
/ 17 сентября 2010

Я думаю, вы слишком усложнили это.Привязка к ширине / высоте ColumnDefinition не будет работать.Я просто создал бы поведение, которое бы подписывалось на событие SizeChanged и устанавливало отсечение на основе ActualWidth [Height].

...