在WPF中自动调整绘图容器

时间:2017-07-20 07:15:47

标签: c# .net wpf xaml

我目前正在开展一个小型C#项目,以便在办公室中查看我们的座位订单。由于我们有多个不同的房间,因此桌面布局是动态创建的。数据来自XML,其中jpg图像(房间布局)存储为base64编码的字符串。此外,XML文件包含所有办公桌的列表,其图像上的绝对像素位置。

到目前为止,我设法将不同的房间图像绘制成一个单独的标签页和所有桌子(存储在一个"桌面" -object的列表中)在他们的位置在图像上。所有这些都是在窗口的xaml文件中完成的。

我的问题是,现在画布根据父母的大小(即标签页的大小)不会调整儿童的大小,即图像和书桌。

我已经尝试过使用网格或者在画布上放置一个视图,并通过覆盖MeasureOverride()函数来编写自定义画布类。

以下是我的xaml文件的最小工作示例:

<TabControl x:Name="tabControl" Grid.Column="0">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>

            <Canvas>
                <Image
                    Source="{Binding Image}" >
                </Image>
                <ItemsControl  ItemsSource="{Binding Docks}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Canvas/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Border
                                    Height="34"
                                    BorderThickness="1"
                                    Tag="{Binding Self}"
                            >
                                <TextBlock 
                                    Text="{Binding Caption}"
                                    RenderTransformOrigin="0.5,0.5"
                                    Width="{Binding DockWidth}"
                                    TextAlignment="Center"
                                    VerticalAlignment="Center"
                                    TextWrapping="Wrap"
                                >
                                </TextBlock>
                                <Border.RenderTransform>
                                    <TransformGroup>
                                        <ScaleTransform/>
                                        <SkewTransform/>
                                        <RotateTransform/>
                                        <TranslateTransform X="{Binding Position.Item1}" Y="{Binding Position.Item2}"/>
                                    </TransformGroup>
                                </Border.RenderTransform>
                            </Border>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </Canvas>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

有人知道我能做什么吗?我没有绑定画布。如果有另一个好方法来完成这项工作,请告诉我。

1 个答案:

答案 0 :(得分:0)

Viewbox应该可以使用。例如,这将正确调整大小(如果你有96 dpi的jpeg,如果没有,我认为你将不得不重新计算画布大小):

<Grid HorizontalAlignment="Stretch"
          VerticalAlignment="Stretch">
        <Viewbox Stretch="Fill"
                 HorizontalAlignment="Stretch"
                 VerticalAlignment="Stretch">
            <Canvas Width="{Binding ElementName=img, Path=ActualWidth}"
                    Height="{Binding ElementName=img, Path=ActualHeight}">
                <Image Name="img"
                       Source="pack://siteoforigin:,,,/images/img1.jpg" />
                <Canvas Canvas.Left="100"
                    Canvas.Top="50">
                <Rectangle Width="50"
                           Height="100"
                           Fill="Beige" />
                <TextBlock Text="AAA" />
            </Canvas>
            </Canvas>
        </Viewbox>
    </Grid>