2010-04-09 4 views
0

Учитывая следующий код XAML:WPF Constrain изменение размера холста дочерний объект с размерами холста

<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 в нагруженном событии так:

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

Как я могу не изменять размер RichTextBox за пределы видимости холста?

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

ответ

2

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

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

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

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

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

Так как вы именованный холст в вашем XAML, вам не нужно связывание с Find Предок, а вы можете просто использовать 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)); 
+0

Да, изменяя первоначальное размещение управления на 0, 0 на банке s будет фиксировать перетаскивание вправо и нижнюю часть края холста. То, с чем я столкнулся, и то, что я не упомянул в моем первоначальном вопросе, изменил размер влево и вверх. Не знаю, как я не поместил это в первоначальный вопрос, но я этого не сделал. Оказывается, это был мой код изменения размера в тех направлениях, которые виноваты. Спасибо за советы по привязке XAML, привязывающий материал по-прежнему иногда меня бросает. – Scott