У меня есть несколько UserControl
с Canvas
. Внутри каждого пользовательского элемента управления у меня есть что-то вроде этого:
<Grid>
<!--other things among resizing thumb-->
<Grid Name="ContentGrid" Grid.Row="1" Grid.Column="1" UseLayoutRounding="True" Background="Transparent" Width="auto" Height="auto">
<ContentPresenter x:Name="BorderShape" IsHitTestVisible="False" HorizontalAlignment="Left" VerticalAlignment="Top"
Panel.ZIndex="{Binding Source={x:Static props:Settings.Default},Path=ZIndex_EntityShape}"
Content="{Binding ElementName=Root,Path=MyShape, Mode=OneWay}"/>
<ContentControl x:Name="BorderContent" DataContext="{Binding .}" Background="Transparent" HorizontalAlignment="Left" VerticalAlignment="Top"
SizeChanged="BorderContent_SizeChanged"
Content="{Binding ElementName=Root,Path=DataContext, Mode=TwoWay}"
ContentTemplateSelector="{Binding Source={x:Static chartRoot:ChartCustomControl.Instance}, Path=EntityContentTemplateSelector, Mode=OneWay}"/>
</Grid>
</Grid>
Теперь BorderContent
- это еще один пользовательский элемент управления, который я загружаю через плагины MEF, который может содержать такие элементы, как расширители, которые могут изменять размер BorderContent
, и обычно родительский элемент UserControl
изменяет размер с помощью этих элементов управления.
Я использую типичный перетаскивание влево-вниз-угол-большой палец для предварительного просмотра событий мыши для изменения размера родительского элемента UserControl
. Примерно так в событии PreviewMouseMove
большого пальца:
var v = currentMousePositionRelativeToCanvas - _ThumbPositionWhenClickedRelativeToCanvas;
BorderContent.Width = Math.Max(BorderContent.ActualWidth + (v.X * Scale), _MinSize);
BorderContent.Height = Math.Max(BorderContent.ActualHeight + (v.Y * Scale), _MinSize);
После изменения размера пользовательского элемента управления вручную с помощью большого пальца он перестает изменять размер с помощью внутренних элементов управления BorderContent
, он просто больше не будет этого делать , он просто остается в новом размере, что бы ни происходило внутри BorderContent
, скрывая все, что выходит за пределы этого размера.
У меня есть другие вещи, которые зависят от размера BorderContent
, поэтому в ручном изменении размера я просто изменяю BorderContent
размер (BorderShape
и родительский UserControl
размеры изменяются при привязке), а не размер родительского элемента управления.
Это похоже на то, что если в данный момент я изменю BorderContent
размер вручную, изменится некоторое логическое значение, и после этого он игнорирует собственные изменения DesiredSize
, поэтому, когда расширители расширяются, размер больше не изменяется. Родительский MeasureOverride
больше не будет вызываться, поэтому я не могу его использовать.
Я хочу, чтобы родительский пользовательский элемент управления адаптировался к внутреннему контенту: если внутреннему контенту требуется расширитель, родитель должен иметь возможность чтобы показать это.
Что я могу сделать? Я попробовал несколько вещей, использование Viewbox
было самым простым, но это просто изменило масштаб, а не размер (когда расширитель расширяется, содержимое просто уменьшается, чтобы уместить его внутри контейнера).