НОВАЯ ИНФОРМАЦИЯ !!!
Между тем я нашел решение, но появилась новая проблема.
Решение состоит в том, чтобы установить поле canvas в code-behind для нового объекта типа Thickness с верхним и левым 1 или 2.
Но холст лежит на табулировании.
Когда я переключаюсь между вкладками или намазываю на холсте, поле теряется.
Я работаю с VS2015 над WPF-приложением и у меня очень любопытная проблема.
Я получил в одном из моих окон WPF холст в качестве родительского элемента для некоторых дочерних элементов.
Одним из этих элементов является прямоугольник, который должен показывать пользователю размер страницы DIN-A4.
Он добавляется в виде кода в дочернюю коллекцию холста.
Обычно я бы поместил этот прямоугольник в положение (0,0).
Но из-за некоторых проблем мне пришлось обмануть и установить позицию (-1, -1) следующим образом:
public static System.Windows.Shapes.Rectangle GetRectangle(double top, double left, double width, double height)
{
var rectangle = new System.Windows.Shapes.Rectangle();
System.Windows.Controls.Canvas.SetLeft(rectangle, -1);
System.Windows.Controls.Canvas.SetTop(rectangle, -1);
rectangle.Width = Math.Round(GetSizeInPoint(width)) + 2;
rectangle.Height = Math.Round(GetSizeInPoint(height));
rectangle.StrokeThickness = 1;
rectangle.Stroke = System.Windows.Media.Brushes.Red;
return rectangle;
}
Но в результате этого видна лишь небольшая часть верхней и левой границы прямоугольника.
Есть ли у меня возможность "переместить" холст, чтобы прямоугольник отображался полностью?
Настоящим еще одним важным проблемным моментом является то, что Сетка с именем grdProtocolDesigner может быть сериализована в XML и сохранена в базе данных.
Так что полная реструктуризация была бы большой проблемой.
Вот соответствующая часть моего XAML, включая холст:
<ContentPresenter x:Name="protocolContainer"
Grid.Row="1"
Grid.Column="0">
<ContentPresenter.Content>
<Grid x:Name="grdProtocolDesigner"
Grid.Row="1"
Grid.Column="0">
<ScrollViewer>
<!--Important! The background of this panel has to be "Transparent" so that drag'n'drop-events can work.
Otherwise the events are not fired.-->
<Canvas x:Name="protocolDesignerPanel"
AllowDrop="True"
Visibility="{Binding DesignerPanelsVisibility}"
Width="2200" Height="4000"
MouseEnter="designerpanel_MouseEnter"
MouseLeave="designerpanel_MouseLeave"
MouseDown="designerpanel_MouseDown"
MouseMove="designerpanel_MouseMove"
MouseUp="designerPanel_MouseUp">
<Canvas.RenderTransform>
<ScaleTransform x:Name="scaleProtocolLayout"/>
</Canvas.RenderTransform>
<Canvas.Background>
<ImageBrush ImageSource="../../pictures/CanvasBackground.png"
TileMode="Tile"
Stretch="None"
Viewport="0, 0, 10, 10"
ViewportUnits="Absolute" />
</Canvas.Background>
</Canvas>
</ScrollViewer>
</Grid>
</ContentPresenter.Content>
</ContentPresenter>