我目前正在开展一个小型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>
有人知道我能做什么吗?我没有绑定画布。如果有另一个好方法来完成这项工作,请告诉我。
答案 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>