ScrollViewer не показывает весь контент, когда холст масштабируется с помощью ScaleTransform - PullRequest
0 голосов
/ 21 января 2019

У меня есть две панели Canvas в ScrollViewer.Одним из них является основной холст с сеткой, нарисованной на заднем плане.Тогда у меня есть два ItemsControl.Первый ItemsControl имеет Stackpanel в качестве своей ItemsPanel с горизонтальной ориентацией.Второй ItemsControl имеет Canvas в качестве панели.На этом холсте я рисую объекты Line в DataTemplate Itemscontrol. На этом холсте есть событие PreviewMouseWheel.В обработчике событий я масштабирую этот холст, который масштабирует объекты Line.Ширина этого холста привязывается к свойству ViewModel CanvasWidth.Также это изменит ширину Outer Canvas, так как его ширина также привязана к свойству ViewModel CanvasWidth.Когда PreviewMouseWheel запущен, я добавляю больше линий сетки на основной CanvasУ меня есть TextBlock над ними как DataTemplate ItemsSource.Перед масштабированием содержимое последнего TextBlock было 14260. После zoomin оно должно оставаться 14260. Но значение шага двух последовательных TextBlock должно быть уменьшено.Сейчас я не могу видеть весь контент через ScrollViewer.Размер шага уменьшен, что было желательно, но новые нарисованные линии сетки не видны через Scrollviewer.Я знаю, что есть контент.но я не могу получить к нему доступ.Scrollviewer не показывает его.

    <Grid x:Name="grid1" >
                <Grid.RowDefinitions>
                    <RowDefinition Height="20" /> 
                    <RowDefinition Height="*" /> 
                    <RowDefinition Height="20" /> 
                </Grid.RowDefinitions>

                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="20" /> 
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*"/>   
                    <ColumnDefinition Width="20"/> 
                </Grid.ColumnDefinitions>
         <ScrollViewer Name="scrollViewer" HorizontalScrollBarVisibility="Auto" Grid.Row="1" Grid.Column="3"   Margin="10,10,0,10" >
                        <Canvas Name="back_canvas"  Height="12000"  Width="{Binding CanvasWidth}" Margin="0,0,10,0" >
                            <Canvas.Background>
                                <DrawingBrush TileMode="Tile" Viewport="0,0,40,40"  ViewportUnits="Absolute"> 
                                    <DrawingBrush.Drawing>
                                        <GeometryDrawing>
                                            <GeometryDrawing.Geometry>
                                                <RectangleGeometry Rect="0,0,50,50"/>
                                            </GeometryDrawing.Geometry>
                                            <GeometryDrawing.Pen>
                                                <Pen Brush="Gray" Thickness="1"/>
                                            </GeometryDrawing.Pen>
                                        </GeometryDrawing>
                                    </DrawingBrush.Drawing>
                                </DrawingBrush>
                            </Canvas.Background>


                            <ItemsControl ItemsSource="{Binding TimeAxis}">
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <StackPanel Orientation="Horizontal" />
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding}"  Margin="0,0,3,0"    Width="37"  Background="GreenYellow" >
                                        </TextBlock>
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                            </ItemsControl>
                        <ItemsControl ItemsSource="{Binding Lines}">
                            <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <Canvas Height="12000" Background="Transparent"  Name="front_canvas" 
                                            PreviewMouseWheel="OnPreviewMouseWheel"
                                              Width="{Binding CanvasWidth, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                            <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                        </Line>
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                        </ItemsControl>
         </Canvas>
         </ScrollViewer>
 </Grid>

 private void UpdateGraph(Canvas canvas, double deltaValue)
        {
            List<MarkerView> markers = new List<MarkerView>();
            scaleFactor += deltaValue;

            double tempScale = scaleFactor;

            if (scaleFactor < 1.0)
            {
                scaleFactor = 1.0;
            }
            if (scaleFactor > maximumScale)
            {
                scaleFactor = maximumScale;
            }

            if (tempScale > 0)
            {
                totalSamples = graphVM.maxSignalLength;

                maximumCanvasWidth = totalSamples * maximumDeltaDistance;
                if(scaleFactor<=maximumDeltaDistance)
                {
                ScaleTransform scaleTransform = new ScaleTransform(scaleFactor, 1);
                canvas.RenderTransform = scaleTransform;
                verticalLines.ForEach(x =>
                {
                    x.RenderTransformOrigin = new Point(1, 1);

                    x.RenderTransform = new ScaleTransform(1 / scaleTransform.ScaleX, 1 / scaleTransform.ScaleY);
                });

                if (deltaValue < 0)
                {
                    graphVM.CanvasWidth = graphVM.InitialCanvasWidth * tempScale;
                }
                else
                {
                    if (graphVM.InitialCanvasWidth * scaleFactor > maximumCanvasWidth)
                        graphVM.CanvasWidth = maximumCanvasWidth;
                    else
                    graphVM.CanvasWidth = graphVM.InitialCanvasWidth * scaleFactor;
                }
                    graphVM.ResetLabels();

                   DeltaDistance = canvas.Width / totalSamples;
                MarkerView markerRed =
                UIHelperView.FindChild<MarkerView>(Application.Current.MainWindow, "splitterRed");
                MarkerView markerGreen =
                UIHelperView.FindChild<MarkerView>(Application.Current.MainWindow, "splitterGreen");
                markers.Add(markerRed);
                markers.Add(markerGreen);

                // Move  Markers with  zooming
                foreach (MarkerView marker in markers)
                {
                        marker.Delta = DeltaDistance; // after zooming if you move the marker then this value will be used to get correct position 
                        Canvas.SetLeft(marker, marker.XPosition * DeltaDistance);
                }

                    markers.Clear();

                }
            }

        }

вот выходное изображение https://imgur.com/a/7WTrBoc это увеличенный вывод https://imgur.com/C7SCOSJ

1 Ответ

0 голосов
/ 21 января 2019

RenderTransform не влияет на ActualWidth / Height элемента управления. Попробуйте вместо этого использовать LayoutTransform.

...