C# 使用ScaleTransform缩放画布时,ScrollViewer不显示所有内容

C# 使用ScaleTransform缩放画布时,ScrollViewer不显示所有内容,c#,wpf,canvas,scrollviewer,scaletransform,C#,Wpf,Canvas,Scrollviewer,Scaletransform,我在ScrollViewer中有两个画布面板。一种是主画布,在其背景上绘制网格形状。然后我有两项控件。第一个ItemsControl将Stackpanel作为水平方向的ItemsPanel。第二个ItemsControl的面板是Canvas。在此画布上,我正在Itemscontrol的DataTemplate中绘制线条对象。此画布上有PreviewMouseWheel事件。在事件处理程序中,我正在缩放这个画布,它正在缩放线条对象。此画布的宽度绑定到ViewModel属性CanvasWidth。此

我在ScrollViewer中有两个画布面板。一种是主画布,在其背景上绘制网格形状。然后我有两项控件。第一个ItemsControl将Stackpanel作为水平方向的ItemsPanel。第二个ItemsControl的面板是Canvas。在此画布上,我正在Itemscontrol的DataTemplate中绘制线条对象。此画布上有PreviewMouseWheel事件。在事件处理程序中,我正在缩放这个画布,它正在缩放线条对象。此画布的宽度绑定到ViewModel属性CanvasWidth。此外,这将更改外部画布的宽度,因为其宽度也绑定到ViewModel属性CanvasWidth。当PreviewMouseWheel启动时,我将在主画布上添加更多网格线。我将TextBlock作为ItemsSource的数据模板覆盖在它们上面。在缩放之前,最后一个文本块的内容是14260。缩放后应保持14260。但两个连续文本块的步长值应减小。现在我无法通过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();

                }
            }

        }

私有void UpdateGraph(画布,双deltaValue)
{
列表标记=新列表();
scaleFactor+=增量值;
双tempScale=scaleFactor;
如果(比例因子<1.0)
{
scaleFactor=1.0;
}
如果(比例因子>最大比例)
{
scaleFactor=最大刻度;
}
如果(温度刻度>0)
{
totalSamples=graphVM.maxSignalLength;
maximumCanvasWidth=总样本数*最大三角距离;
if(scaleFactor)
{
x、 RenderTransferMorigin=新点(1,1);
x、 RenderTransform=新的ScaleTransform(1/ScaleTransform.ScaleX,1/ScaleTransform.ScaleY);
});
如果(deltaValue<0)
{
graphVM.CanvasWidth=graphVM.InitialCanvasWidth*tempScale;
}
其他的
{
if(graphVM.InitialCanvasWidth*scaleFactor>maximumCanvasWidth)
graphVM.CanvasWidth=最大CanvasWidth;
其他的
graphVM.CanvasWidth=graphVM.InitialCanvasWidth*缩放因子;
}
graphVM.ResetLabels();
DeltaDistance=canvas.Width/totalSamples;
马克尔维马克雷德=
UIHelperView.FindChild(Application.Current.main窗口,“splitterRed”);
马克维马克格林=
UIHelperView.FindChild(Application.Current.main窗口,“splitterGreen”);
markers.Add(markerRed);
markers.Add(markerGreen);
//通过缩放移动标记
foreach(标记中的标记视图标记)
{
marker.Delta=DeltaDistance;//缩放后,如果移动标记,则此值将用于获得正确的位置
Canvas.SetLeft(marker,marker.XPosition*DeltaDistance);
}
标记。清除();
}
}
}
这是输出图片
这是缩放输出

渲染转换不会影响控件的实际宽度/高度。尝试改用LayoutTransform。

您能帮我吗?我试着使用LayoutTransform。这给了我更糟糕的结果。画布宽度没有增加。此外,通过layoutTransform无法正确实现缩放功能。能否在设置缩放变换的位置添加代码?如何计算画布宽度?我在上面添加了缩放代码。请看一看;graphVM=数据上下文作为GraphViewModel;