WPF Ограничить изменение размера дочернего объекта canvas для размеров canvas - PullRequest
0 голосов
/ 10 апреля 2010

Учитывая следующее XAML:

<Window x:Class="AdornerTesting.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="500" Width="500"
        Loaded="Window_Loaded">
    <Grid Name="grid">
        <Canvas Name="canvas" Width="400" Height="400" Background="LightGoldenrodYellow">
            <RichTextBox Name="richTextBox" Canvas.Top="10" Canvas.Left="10" BorderBrush="Black" BorderThickness="2"
                     Width="200"
                     Height="200"
                     MaxWidth="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Canvas}},Path=ActualWidth}"
                     MaxHeight="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Canvas}},Path=ActualHeight}"/>
        </Canvas>
    </Grid>
</Window>

и набор украшений, добавляемых в RichTextBox в событии Loaded, например:

AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(richTextBox);
adornerLayer.Add(new ResizeAdorner(richTextBox));

Как мне избежать изменения размера RichTextBox за пределами видимых границ Canvas?

ResizeAdorner - это по сути тот же код, который можно найти в примере MSDN adorner, и он работает просто отлично. Должен ли я что-то делать с привязками MaxWidth и MaxHeight в коде, чтобы вычислить, как можно изменить размер RichTextBox? Или есть способ сделать это в XAML?

1 Ответ

2 голосов
/ 10 апреля 2010

Если вы ссылаетесь на образец ResizingAdorner на MSDN , то отправленный вами код технически верен, поскольку RichTextBox не будет больше вашего холста.

Что вы можете видеть, так это то, что при изменении размера текстового поля нижняя и правая стороны будут расширяться на 10 пикселей за границы холста. Это потому, что в XAML, который вы опубликовали, написано, что MaxHeight и MaxWidth в поле расширенного текста будут высотой / шириной холста.

Причина, по которой поле расширенного текста расширяется на 10 пикселей за пределы холста, заключается в том, что поле расширенного текста расположено в расположении холста Canvas.Top = "10" и Canvas.Left = "10".

Если вы установите для поля расширенного текста значение Canvas.Top = "0" Canvas.Left = "0", то увидите, что поле расширенного текста никогда не превысит границы холста.

Несколько замечаний по XAML и коду позади ...

Поскольку у вас есть именованный холст в вашем XAML, вам не нужно связывать с Find Ancestor, скорее вы можете просто использовать ElementName в своем связывании, т.е.

<RichTextBox ...
   MaxWidth="{Binding ElementName=canvas,Path=ActualWidth}"
   MaxHeight="{Binding ElementName=canvas,Path=ActualHeight}"/>

В коде сзади AdornerLayer должен быть вашим холстом, а не RichTextBox, т.е.

AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(canvas);
adornerLayer.Add(new ResizeAdorner(richTextBox));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...